最短无序连续子数组--力扣
Posted 穿迷彩服的鲨鱼
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最短无序连续子数组--力扣相关的知识,希望对你有一定的参考价值。
前言
给你一个整数数组 nums ,你需要找出一个 连续子数组 ,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
请你找出符合题意的 最短 子数组,并输出它的长度。
一、示例
示例 1:
输入:nums = [2,6,4,8,10,9,15]
输出:5
解释:你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
示例 2:
输入:nums = [1,2,3,4]
输出:0
示例 3:
输入:nums = [1]
输出:0
二、代码解析
1.最短无序连续子数组
代码如下(示例):
int findUnsortedSubarray(vector<int>& nums)
{
/*排序(双指针)
* 将数组 nums 进行排序,记为 numsSort,
* 然后比较 nums 和 numsSort 的元素来决定最左边和最右边不匹配的元素。
* 它们之间的子数组就是要求的最短无序子数组。
* 首先,从左向右遍历两个数组,找到第一次两个数组中元素不同的位置,
* 即为最左边的不同的位置也就是最短无序连续子数组的左边界。
* 然后,从右向左遍历两个数组,找到第一次两个数组中元素不同的位置,
* 即为最右边的不同的位置也就是最短无序连续子数组的右边界。
*/
int len = nums.size();
if (len==1)//如果长度是1 直接返回0
{
return 0;
}
int first = -1, finally = -1;
vector<int> sortNums(nums); //把nums赋值给一个新数组进行排序
sort(sortNums.begin(), sortNums.end());
for (int i = 0; i < len; i++)
{
if (sortNums[i] != nums[i])//从左往右遍历,找到第一个与之不相等的数记录下标
{
if (first == -1)//只记录一次
{
first = i;
}
}
if (sortNums[len - i - 1] != nums[len - i - 1])//从右往左遍历,找到第一个与之不相等的数记录下标
{
if (finally == -1)//只记录一次
{
finally = len - i - 1;
}
}
}
if (finally > first)
{
return finally - first + 1;
}
else
{
return 0;
}
}
2.测试代码
代码如下(示例):
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int findUnsortedSubarray(vector<int>& nums)
{
/*排序(双指针)
* 将数组 nums 进行排序,记为 numsSort,
* 然后比较 nums 和 numsSort 的元素来决定最左边和最右边不匹配的元素。
* 它们之间的子数组就是要求的最短无序子数组。
* 首先,从左向右遍历两个数组,找到第一次两个数组中元素不同的位置,
* 即为最左边的不同的位置也就是最短无序连续子数组的左边界。
* 然后,从右向左遍历两个数组,找到第一次两个数组中元素不同的位置,
* 即为最右边的不同的位置也就是最短无序连续子数组的右边界。
*/
int len = nums.size();
if (len==1)//如果长度是1 直接返回0
{
return 0;
}
int first = -1, finally = -1;
vector<int> sortNums(nums); //把nums赋值给一个新数组进行排序
sort(sortNums.begin(), sortNums.end());
for (int i = 0; i < len; i++)
{
if (sortNums[i] != nums[i])//从左往右遍历,找到第一个与之不相等的数记录下标
{
if (first == -1)//只记录一次
{
first = i;
cout << "first="<<first << endl;//测试
}
}
if (sortNums[len - i - 1] != nums[len - i - 1])//从右往左遍历,找到第一个与之不相等的数记录下标
{
if (finally == -1)//只记录一次
{
finally = len - i - 1;
cout <<"finally="<< finally << endl;//测试
}
}
}
if (finally > first)
{
return finally - first + 1;
}
else
{
return 0;
}
}
int main()
{
vector<int> nums = { 1,3,2,2,2 };
cout << findUnsortedSubarray(nums);
return 0;
}
3.测试结果
总结
以上是关于最短无序连续子数组--力扣的主要内容,如果未能解决你的问题,请参考以下文章