LeetCode: 581. Shortest Unsorted Continuous Subarray

Given an integer array, you need to find one continuous subarray that if you only sort this subarray in ascending order, then the whole array will be sorted in ascending order, too.

You need to find the shortest such subarray and output its length.

Example 1:

Input: [2, 6, 4, 8, 10, 9, 15]
Output: 5
Explanation: You need to sort [6, 4, 8, 10, 9] in ascending order to make the whole array sorted in ascending order.

Note:

  1. Then length of the input array is in range [1, 10,000].
  2. The input array may contain duplicates, so ascending order here means <=.

題意:給定序列,返回需要重排的最短子序列長度。
分析:去除需要重排的子序列之後的數據必然是在正確順序的位置上面。所以只要確定兩邊最開始不在正確位置上的數即可。
方法一:將數據排序,然後從前向後掃描找到最開始處於不正確位置的數據,從後向前掃描找到最後處於不正確位置的數據。複雜度O(nlogn)。
代碼如下:

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int[]sort=new int[nums.length];
        for(int i=0;i<nums.length;i++)
            sort[i]=nums[i];
        Arrays.sort(sort);
        int start=nums.length-1;
        for(int i=0;i<nums.length;i++)
            if(nums[i]!=sort[i])
            {
                start=i;
                break;
            }
        int ed=start-1;
        for(int i=nums.length-1;i>start;i--)
            if(nums[i]!=sort[i])
            {
                ed=i;
                break;
            }
        return ed-start+1;
    }
}

方法二:
換一種思路,同上只要從前向後找到第一個不在其位的數A,從後向前找到第一個不在其位的數B,中間的數即是需要重新排序的最小序列。複雜度是O(n)。
從前向後掃描,當前數如果在其位,則必然當前數是之前序列的最大值,如果不是,則必然在這個位置失序。同理,從後向前掃描,如果當前數在其位,則必然當前數是後面數的最小值。
需要注意的是,記錄的兩個位置,最大值失序位置是小於最小值失序位置的。
代碼如下:

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int n=nums.length;
        int max=nums[0];
        int min=nums[n-1];
        int start=-2;
        int ed=-1;
        for(int i=1;i<n;i++)
        {
            if(max<nums[i])
                max=nums[i]; 
            else
                ed=i;
            if(min>nums[n-1-i])
                min=nums[n-1-i];
            else
                start=n-1-i;
        }
        return ed-start+1;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章