力扣581 最短无序连续子数组

最短无序连续子数组

力扣581. 最短无序连续子数组

思路:双指针。

  1. 将数组分成3段:有序左段、无序中段、有序右段

  1. 中段的任意值(包括最小值),都大于左段,因此可以找到无序中段的起点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;
            }
        }
  1. 无序中段的末尾end类似。
  2. 无序数组长度为 end - start + 1

PS:为什么从右向左遍历时,需要维护一个最小值。

最小值用来寻找乱序的起点,在遍历过程中寻找无序中段的start。

posted @ 2022-10-08 19:08  OraCat  阅读(6)  评论(0编辑  收藏  举报