本文主要是介绍leetcode:最短无序连续子数组,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray
题目描述
给定一个整数数组,你需要寻找一个连续的子数组,如果对这个子数组进行升序排序,那么整个数组都会变为升序排序。
你找到的子数组应是最短的,请输出它的长度。
示例 1
输入: [2, 6, 4, 8, 10, 9, 15]
输出: 5
解释: 你只需要对 [6, 4, 8, 10, 9] 进行升序排序,那么整个表都会变为升序排序。
说明
输入的数组长度范围在 [1, 10,000]。
输入的数组可能包含重复元素 ,所以升序的意思是<=。
题目分析
根据题目,需要确定该子数组的头和尾,说到确定数组的头和尾,最常用的应该就是双指针了吧(至少我是这样);
我的思路:双指针法
先将nums数组的内容复制到tmp数组中,再对tmp数组排序,利用双指针进行比较,不断向中间靠拢,若出现首尾的元素均不相同,则跳出循环,此时双指针指向的位置就是需要重新排序的位置,当然还有一种情况,就是原本数组就是一个已经排后序的数组,此时返回0即可。
已在代码中添加注释,方便理解
int findUnsortedSubarray(vector<int>& nums)
{vector<int> temp(nums.begin(), nums.end());sort(temp.begin(), temp.end());int left = 0;int right = nums.size() - 1;//设置双指针, 一个指向头, 一个指向尾while (left < right){int flag = 1; //设置一个flagif (nums[left] == temp[left]) //左指针对应相等,left++,右移继续比较下一个{left++;flag = 0; } if (nums[right] == temp[right]) //右指针相等,j--,左移比较下一个{right--; flag = 0; }if (flag == 1)//不相等,则跳出循环{break;}}if (left >= right)//本是有序数组{return 0;}return right - left + 1;
}
这篇关于leetcode:最短无序连续子数组的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!