最短无序连续子数组--力扣

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.测试结果

在这里插入图片描述

总结

在这里插入图片描述

以上是关于最短无序连续子数组--力扣的主要内容,如果未能解决你的问题,请参考以下文章

581-最短无序连续子数组

LeetCode 最短无序连续子数组

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

《LeetCode之每日一题》:113.最短无序连续子数组

leetcode 最短无序连续子数组 中等

最短无序连续子数组