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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34446716/article/details/85336302
今日推荐