leetcode6080. 使数组按非递减顺序排列(周赛,中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:list模拟
时间复杂度分析: 最能就是把所有元素删除完,因此复杂度为元素的数目O(n)
具体思路:删除nums[i]后,右边的向左移,因此下一轮可能被删除的就是nums[i+1]的元素(由上一轮删除的能推出下一轮可能会的),因此,用list来删除元素来达到O(1)删除的目的

实现:vector保存每一轮要被删除的元素,不断更新vector,直到vector为空为止

class Solution {
public:
    int totalSteps(vector<int>& nums) {
 
        list<int> lst(nums.begin(), nums.end());
        vector<list<int>::iterator> v; //要删除的节点
        for (auto it = lst.begin(); next(it) != lst.end(); ++it) {
            if (*it > *next(it)) {
                v.push_back(next(it));
            }
        }
        int ans = 0;
        while (v.size()) {
            ans++;
            vector<list<int>::iterator> tmp; //tmp存要删除元素的pre节点
            for (auto p : v) {
                auto pre = prev(p);
                lst.erase(p);
                if (tmp.empty() || pre != tmp.back()) tmp.push_back(pre); 
                //删除前一个元素后 当前元素的prev跟前一个元素的prev相同
            }
            v.clear();
            for (auto p : tmp) {
                if (next(p) != lst.end() && *p > *next(p)) {
                    v.push_back(next(p));
                }
            }
        }
        return ans;
    }
};

代码上的难点:vector存即将删除的节点,而不是删除结点的prev,带来的好处是vector中的节点始终是存在的,并且通过这些迭代器找prev也很容易

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值