18 力扣热题刷题记录之第581题最短无序连续子数组

本文分享了解决LeetCode问题`Shortest Unsorted Continuous Subarray`的两种思路:直接比较与排序查找。作者首先尝试简单地前后元素对比,然后发现需要排序辅助,以找出不在正确位置的首尾元素。官方解法利用双指针技巧找到左右边界。
摘要由CSDN通过智能技术生成

系列文章目录

力扣热题刷题记录

前言

每天进步一点点!!

一、背景

在这里插入图片描述

来源:力扣
链接: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)

总结

没有思路,到有思路。我选择先把最简单的思路实现它,即使知道考虑不够完整。一时间又不知道哪里没有考虑清楚,通过调试来发现更多关于问题的关键点,这样促进我想更多思路去积极解决问题。

喜欢就点个赞叭!!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值