581. Shortest Unsorted Continuous Subarray

1、題目數組

  一、審題 spa

  

  二、分析指針

    給定一個無序整形數組,將其變爲有序,最少要將連續的多少個元素進行排序。code

 

2、解答blog

  一、思路排序

    ① 採用兩個指針。 begin 記錄須要排序的元素的最低下標; end 記錄須要排序的元素的最高下標。class

    ② 順序遍歷數組, 採用變量 max,記錄到當前元素爲止的最大元素值,若當前元素值 < max ,即此元素須要進行從新排序。採用 end 記錄。變量

    ③ 逆序遍歷數組,採用變量 min,記錄到當前元素爲止的最小元素值,若當前元素值 > min,即詞元素值也須要從新怕徐。採用 begin 記錄。遍歷

    ④ 最終須要排序的元素下標序列爲 begin ~ end 。 總元素個數爲 end - begin +1;im

    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;
    }
相關文章
相關標籤/搜索