因此,我们需要两个指针来维护这样的 i 和 j。起初 j 指向数组尾部,然后不断往前移动,直到前面的元素小于当前所指元素。然后初始化答案为 j 前面的元素个数。
然后我们让 i 从 0 开始,直到 n - 1。对于每个 i,我们让 j 不断地向后移动,直到 arr}[j] \ge \textit{arr}[i] 或者 j = n,此时 j - i - 1 就是我们要删除的元素个数,用它来更新答案。然后令 i 等于 i + 1,并保证 arr}[i + 1] \ge \textit{arr}[i],如果不满足则直接跳出循环,如果满足则继续下一轮枚举。
代码
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution: deffindLengthOfShortestSubarray(self, arr: List[int]) -> int: n = len(arr) j = n - 1 while j > 0and arr[j - 1] <= arr[j]: j -= 1 if j == 0: return0 res = j for i inrange(n): while j < n and arr[j] < arr[i]: j += 1 res = min(res, j - i - 1) if i + 1 < n and arr[i] > arr[i + 1]: break return res
intfindLengthOfShortestSubarray(int* arr, int arrSize) { int n = arrSize, j = n - 1; while (j > 0 && arr[j - 1] <= arr[j]) { j--; } if (j == 0) { return0; } int res = j; for (int i = 0; i < n; i++) { while (j < n && arr[j] < arr[i]) { j++; } res = MIN(res, j - i - 1); if (i + 1 < n && arr[i] > arr[i + 1]) { break; } } return res; }
var findLengthOfShortestSubarray = function(arr) { let n = arr.length, j = n - 1; while (j > 0 && arr[j - 1] <= arr[j]) { j--; } if (j === 0) { return0; } let res = j; for (let i = 0; i < n; i++) { while (j < n && arr[j] < arr[i]) { j++; } res = Math.min(res, j - i - 1); if (i + 1 < n && arr[i] > arr[i + 1]) { break; } } return res; };