581. 最短无序连续子数组

2021-12-29  本文已影响0人  名字是乱打的

一 题目:

二 思路:

分析:这个子数组有个特征

因此可以分析出几个思路:
思路1:双指针+排序

思路2:效率更高
同时从前往后和从后往前遍历,分别得到要排序数组的右边界和左边界;

三 代码:

思路1,双指针+排序

class Solution {
    public int findUnsortedSubarray(int[] nums) {
        //拷贝份
        int[] clone = nums.clone();
        Arrays.sort(clone);

        //子数组左边界
        int left=0;
        //子数组右边届
        int right=nums.length-1;
        while (left<nums.length){
            if (nums[left]==clone[left]){
                left++;
            }else {
                break;
            }
        }

        while (right>=0){
            if (nums[right]==clone[right]){
                right--;
            }else {
                break;
            }
        }
        return right>left?right-left+1:0;
    }
}

思路2:

public int findUnsortedSubarray(int[] nums) {
        int len=nums.length;
        int max=nums[0];
        int min=nums[len-1];
        //这里right定义为-1,是为了避免数组本身有序的情况
        int left=0,right=-1;
        for (int i = 0; i < len; i++) {
            //寻找右边届
            if (max>nums[i]){
                right=i;
            }else {
                max=nums[i];
            }

            //寻找左边界
            if (min<nums[len-1-i]){
                left=len-1-i;
            }else {
                min=nums[len-1-i];
            }
        }
        return right-left+1;
    }
上一篇 下一篇

猜你喜欢

热点阅读