LeetCode 面试题 16.16. 部分排序**

具体思路:

单调栈思路好理解,但是题解用的是两次遍历;

举例来说:对于右边界,必定是出现在了前半边最大值的右边;

因此,如果记录当前最大值,如果array[i]小于最大值,则记其为右边界,否则则更新最大值;

具体代码:

1.单调栈:

class Solution {
public:
    vector<int> subSort(vector<int>& array) {
        if(array.size()<2)
            return {-1,-1};
        vector<int>st;
        int maxn=INT_MIN;
        for(int i=0;i<array.size();i++){
            while(!st.empty()&&array[i]<array[*st.rbegin()]){
                maxn=max(maxn,array[*st.rbegin()]);
                st.pop_back();
            }
            st.push_back(i);
        }
        int s=-1;
        int e=-1;
        for(int i=0;i<st.size();i++){
            s=i;
            if(st[i]!=i)
                break;
        }
        for(int i=st.size()-1;i>=0;i--){
            int index=st[i];
            if(array[index]<maxn){
                e=index;
                break;
            }
        }
        if(s==-1||e==-1){
            return {-1,-1};
        }
        return {s,e};
        
    }
};

2.两次遍历思路:

class Solution {
public:
    vector<int> subSort(vector<int>& array) {
        int maxn=INT_MIN;
        int minx=INT_MAX;
        int start=-1,last=-1;
        for(int i=0;i<array.size();i++){
            if(array[i]>=maxn){
                maxn=max(array[i],maxn);
            }else{
                last=i;
            }
        }
        for(int i=array.size()-1;i>=0;i--){
            if(array[i]<=minx){
                minx=min(array[i],minx);
            }else{
                start=i;
            }
        }
        if(start==-1||last==-1)
            return {-1,-1};
        return {start,last};
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值