系列文章目录
前言
每天进步一点点!!
一、背景
来源:力扣
链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/
二、我的思路
初一看,发现,前后元素比较,看看次序对不,次序不对,标记为0,如此标记第一个次序和最后一个次序不对的,两者一运算,岂不是可以了。
但是当最后一个次序不对之后的元素,虽然后面相对次序对,难以保证这后面每个元素都大于前面的元素啊,这下咋办?
艾,既然这样,说明元素在正确位置上的元素就不用动,不如给它排个序,原数组和排序的数组一对比,看看第一个不在位置上喝最后一个不在位置上的元素即可。
OK,测试通过,代码如下:
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums) {
vector<int> ve(nums.size(),1);//假设是升序,全置为1表示当前元素比前面一个大
vector<int> my_ve(nums.size());
for(int i=0;i<nums.size();i++)
{
my_ve[i]=nums[i];
}
sort(my_ve.begin(),my_ve.end());
int maxi=0,maxj=0;
bool flag=false;
for(int i=0;i<nums.size();i++)
{
ve[i]=nums[i]==my_ve[i]?1:0;
if(ve[i]==0)
{
if(flag==false)
{
maxi=i;
flag=true;
}
else
maxj=i;
}
}
if(flag==false)
return 0;
else
return maxj-maxi+1;
}
};
三、官方的思路
1.与我一致
我用的是STL库自带的sort函数,官方是自己写的排序,算法复杂度是O(nlog n)
2.巧妙思想
既然是找不在位置上的一组数据,那么这组数据一定满足,任何一个数据大于左侧的最大值,任何一个数据小于右侧的最小值。
如果不这样的话,说明这组数据不是最终要改变的,还可以更大。
这样的话,我们就要找到左侧最大值,和右侧最小值。
一个循环,两侧同时开始,如果发现有小于左侧的最大值的,说明这个数据就是乱序的开始;如果发现有大于右侧最小值的,这个数据就是乱序的结束。
代码如下:
class Solution {
public:
int findUnsortedSubarray(vector<int>& nums)
{
//初始化
int len = nums.size();
int min = nums[len-1];
int max = nums[0];
int begin = 0, end = -1;
//遍历
for(int i = 0; i < len; i++){
if(nums[i] < max){ //从左到右维持最大值,寻找右边界end
end = i;
}else{
max = nums[i];
}
if(nums[len-i-1] > min){ //从右到左维持最小值,寻找左边界begin
begin = len-i-1;
}else{
min = nums[len-i-1];
}
}
return end-begin+1;
}
};
作者:xmblgt
链接:https://leetcode-cn.com/problems/shortest-unsorted-continuous-subarray/solution/si-lu-qing-xi-ming-liao-kan-bu-dong-bu-cun-zai-de-/
来源:力扣(LeetCode)
总结
没有思路,到有思路。我选择先把最简单的思路实现它,即使知道考虑不够完整。一时间又不知道哪里没有考虑清楚,通过调试来发现更多关于问题的关键点,这样促进我想更多思路去积极解决问题。
喜欢就点个赞叭!!!