581. Shortest Unsorted Continuous Subarray

一、题目

  1、审题 

  

  2、分析

    给定一个无序整形数组,将其变为有序,最少要将连续的多少个元素进行排序。

 

二、解答

  1、思路

    ① 采用两个指针。 begin 记录需要排序的元素的最低下标; end 记录需要排序的元素的最高下标。

    ② 顺序遍历数组, 采用变量 max,记录到当前元素为止的最大元素值,若当前元素值 < max ,即此元素需要进行重新排序。采用 end 记录。

    ③ 逆序遍历数组,采用变量 min,记录到当前元素为止的最小元素值,若当前元素值 > min,即词元素值也需要重新怕徐。采用 begin 记录。

    ④ 最终需要排序的元素下标序列为 begin ~ end 。 总元素个数为 end - begin +1;

    public int findUnsortedSubarray(int[] nums) {
        int n = nums.length;
        int begin = -1, end = -2;    // 若数组已经有序,则最终的结果 end - begin + 1 == 0
        int min = Integer.MAX_VALUE, max = Integer.MIN_VALUE;
        // begin 比 min 大, end 比 max 小
        // 找到最后的一个元素, 这个元素从左看比最大的石头小(end 后面的都比最大的数值大)
        for (int i = 0; i < n; i++) {
            max = Math.max(max, nums[i]);
            if(nums[i] < max)
                end = i;
        }
        
        // 找到最前面的一个元素,这个元素从右看比最小的石头大。(begin 前面的都比最下的数值小)
        for (int i = n - 1; i >= 0; i--) {
            min = Math.min(min, nums[i]);
            if(nums[i] > min)
                begin = i;
        }
        return end - begin + 1;
    }

 

posted @ 2019-05-28 11:00  skillking2  阅读(43)  评论(0编辑  收藏