LeetCode 581. 最短无序连续子数组 | C语言版

文章介绍了如何解决LeetCode第581题,即找到能通过升序排序使整个数组有序的最短无序连续子数组。提供了两种解题思路:一是使用双指针法,二是优化遍历节点数的方法。代码实现分别用C语言展示了这两种思路,并给出了运行结果。
摘要由CSDN通过智能技术生成

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

题目描述

题目地址581. 最短无序连续子数组
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。

请你找出符合题意的 最短 子数组,并输出它的长度。

在这里插入图片描述

解题思路

思路一:使用双指针
代码实现
class Solution {
public:
    int findUnsortedSubarray(vector<int>& nums) {
        //使用双指针
        //数组分为三段:有序1+无序+有序2 (有序1<有序2),只需要确定无序的边界,使用无序右边界max和无序左边界min:有序部分从左往右max肯定是在一直更新的(增大),min同理;无序部分从左往右max肯定不是在一直更新的(增大),会出现逆序(<max),那么就将max更新为这个逆序,以此类推,min同理;
        //例如:2 6 4 8 10 9 15,从左往右max依次更新为4,9,最终max=9,从右往左min依次更新为10,6,最终min=6,所以无序的区间就是[6,4,8,10,9]
        
         int n=nums.size();
         //记录无序部分左边界min和右边界max
         int maxx=nums[0],minn=nums[n-1];

         int l=-1,r=-1;

         for(int i=1;i<n;i++){
             if(nums[i]<maxx){
                 //更新右边界下标
                 r=i;
             }else{
                 maxx=max(maxx,nums[i]);
             }

             if(nums[n-1-i]>minn){
                 //更新左边界下标
                 l=n-1-i;
             }else{
                 minn=min(minn,nums[n-1-i]);
             }

         }
         //计算无序部分长度
         return r==-1 ? 0: r-l+1;
    }
};
运行结果

在这里插入图片描述

参考文章:

https://leetcode.cn/problems/shortest-unsorted-continuous-subarray/solutions/911869/581-zui-duan-wu-xu-lian-xu-zi-shu-zu-si-8rivt/

思路二:减少遍历节点数
代码实现
在这里插入代码片
运行结果
参考文章:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李莲花*

多谢多谢,来自一名大学生的感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值