1. 程式人生 > >135、最短無序連續子陣列

135、最短無序連續子陣列

題目描述
給定一個整數陣列,你需要尋找一個連續的子陣列,如果對這個子陣列進行升序排序,那麼整個陣列都會變為升序排序。

你找到的子陣列應是最短的,請輸出它的長度。

示例 1:

輸入: [2, 6, 4, 8, 10, 9, 15]
輸出: 5
解釋: 你只需要對 [6, 4, 8, 10, 9] 進行升序排序,那麼整個表都會變為升序排序。
首先複製一個和nums一樣的陣列,這裡複製不能直接用等於號,因為這樣複製的話地址也是一樣,也就是說nums2排序那麼nums也會排序,然後進行對比,直接上程式碼

class Solution {
    public int findUnsortedSubarray(int[] nums) {
       int nums2[] = Arrays.copyOf(nums, nums.length);
		//對複製的nums2進行排序
		
		Arrays.sort(nums2);
		
		
		int start = 0;
		int end = nums.length -1;
		for (int i = 0; i < nums2.length -1; i++) {
			if(nums[i] == nums2[i]){
				start ++;
			}else {
				break;
			}
			
		}
		for (int i = nums2.length -1 ; i >=0; i--) {
			if(nums[i] == nums2[i]){
				end --;
				if(end<=start ){
					return 0;
				}
			}else {
				break;
			}
		}
		return end - start +1;
		 
    }
}

排名靠前的程式碼,思路差點不其實

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int left = 0, cur = 0;
        while (cur < nums.length - 1) {
            if (nums[cur] <= nums[cur + 1]) {
                cur++;
                left = cur;
            } else {
                break;
            }
        }
        if (cur == nums.length - 1) {
            return 0;
        }
        while (cur < nums.length) {
            while (left > -1 && nums[left] > nums[cur]) {
                left--;
            }
            cur++;
        }

        int right = nums.length - 1;
        cur = right;
        while (cur > 1) {
            if (nums[cur] >= nums[cur - 1]) {
                cur--;
                right = cur;
            } else {
                break;
            }
        }
        if (right == 0) {
            return 0;
        }
        while (cur > -1) {
            while (right < nums.length && nums[right] < nums[cur]) {
                right++;
            }
            cur--;
        }
        return right - left - 1;
    }
}