581. 最短无序连续子数组_【有最字,但不用dp】

本文介绍了一种高效算法,用于找出一个整数数组中,通过升序排序后能使整个数组变为升序的最短子数组。文章提供了两种方法,一种通过比较原数组与排序后数组找到边界,另一种通过从两端遍历确定需调整元素的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题

给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

你找到的子数组应是最短的,请输出它的长度。
例子

在这里插入图片描述

思路
不用动态规划。
我们将数组 nums排序,然后我们比较 nums 和 排序后的元素找到最左边和最右边不匹配的元素。它们之间的子数组就是要求的最短无序子数组。

  • 方法1

  • 方法2

    从左往右遍历,如果该元素nums[i]<到目前为止的最大值【本来应该>左边的最大值】,则表示该数应该调整,并将high=i,则最后一个要调整的数为high
    从右往左遍历,如果该匀速nums[i]>到目前为止的最小值【本来应该<右边的最小值】,则表示该数应该调整,并将low=i,则最后一个要调整的数为low

    当是正序时,low=-1, high=len,所以要先看high>=low?

代码

//方法1
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        int[] arr = Arrays.copyOfRange(nums,0,nums.length);
        Arrays.sort(arr);
        
        int i=0,j=nums.length-1;
        while(i<=nums.length-1) {
            if(arr[i]<nums[i]) break;
            i++;
        }
        while(j>=0) {
            if(arr[j]>nums[j]) break;
            j--;
        }
        //可能是正排序 i=len,j=-1
        return j-i+1>0?j-i+1:0;
        
    }
}
//方法2
class Solution {
    public int findUnsortedSubarray(int[] nums) {
        if(nums.length==1) return 0;
        int max = nums[0],min=nums[nums.length-1];
        int high = 0,low=nums.length-1;
        
        for(int i=1;i<nums.length; i++) {
            
            max = Math.max(max, nums[i-1]);
            if(nums[i]<max) high=i;
        }
        for(int i=nums.length-2; i>=0; i--) {
            min = Math.min(min, nums[i+1]);
            if(nums[i]>min) low=i;
        }
        
        return high>=low?high-low+1:0;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值