LeetCode 581. 最短无序连续子数组 | C语言版
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;
}
};
运行结果
参考文章:
思路二:减少遍历节点数
代码实现
在这里插入代码片