力扣581 最短无序连续子数组
最短无序连续子数组
力扣581. 最短无序连续子数组
思路:双指针。
- 将数组分成3段:有序左段、无序中段、有序右段
- 中段的任意值(包括最小值),都大于左段,因此可以找到无序中段的起点start:维护一个最小值min(初始最小为num[len-1]),从右向左遍历,更新最小值;当遍历过程中,出现比min大的数时,不更新最小值,而是更新start。由此start被更新到了中段起始,min则为中段最小。
int len = nums.length;
int min = nums[len - 1];
int start = 0;
for (int i = 0; i < len; i++) {
if (nums[len - i - 1] <= min) {
min = nums[len - i - 1];
} else {
start = len - i - 1;
}
}
- 无序中段的末尾end类似。
- 无序数组长度为 end - start + 1
PS:为什么从右向左遍历时,需要维护一个最小值。
最小值用来寻找乱序的起点,在遍历过程中寻找无序中段的start。