博主头像
7024w的自留地

觉宇宙之无穷,识盈虚之有数

Leetcode 581. 最短无序连续子数组

屏幕截图 2021-10-15 105254.png
屏幕截图 2021-10-15 105254.png

方法1.使用JDK排序后进行对比

public int findUnsortedSubarray(int[] nums) {
    int[] sort = nums.clone();
    Arrays.sort(sort);
    int len = sort.length;
    int left  = 0;
    int right = len - 1;
    while(left < len){
        if(sort[left] == nums[left]){
            left++;
        }else{
            break;
        }
    }
    
    while(right > 0 && left < right){
        if(sort[right] == nums[right]){
            right--;
        }else{
            break;
        }
    }
    return right - left + 1;

}

方法2.类比insert sort
找到两侧的单调结束区域,对其进行遍历,如果出现其中的值小于/大于端点的值,就端点进行移动。

public int findUnsortedSubarray(int[] nums) {
    int len = nums.length;
    int i = 0;
    int j = len - 1;
    while(i < j && nums[i] <= nums[i+1]){
        i++;
    }
    while(i < j && nums[j] >= nums[j-1]){
        j--;
    }
    int m = i;
    int k = j;
    for(int a = m; a <= k; a++){
        while(i > 0 && nums[a] < nums[i-1]){
            i--;
        }
        while((j+1) < len && nums[a] > nums[j+1]){
            j++;
        }
    }
    return (j-i) == 0 ? 0 : (j-i) + 1;
}
发表新评论