LeetCode 27. 移除元素:题解|刷题打卡

·  阅读 70

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

一、题目描述:

力扣今天的每日一题和昨天类似,但是这道题的要求的修改可以是“不稳定”的,也就是元素的顺序可以改变。本来我以为今天只是昨天的简单重复,但是加上这个条件后就可以做到对特殊情况的优化,让我们一起来看看吧,LeetCode 27. 移除元素

image.png

二、思路分析:

我们当然可以采用与昨天相同的快慢指针的方法来写,满足条件就将元素放入新数组的末尾,这样做的时间复杂度是 O(n)O(n)。我们不妨考虑一下最坏的情况,要删除的元素刚好位于数组的开始,那么我们采用快慢指针的做法需要将后面的元素全都向前移动,比如 [1,2,3,4][1, 2, 3, 4] 要删除 11 的话需要三次赋值操作,但我们也能发现,如果直接用 44 覆盖 11 也可以得到要求的新数组,虽然不保留原来的元素顺序,而且只需要一次赋值操作。

所以我们可以每次对遍历到的新元素检查,如果等于要删除的 valval,就用数组末尾的元素覆盖它,而后将要修改的数组范围缩小,在代码里表现为 --r,然后就转化成了一个规模更小的相同问题。

三、AC 代码:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int l = 0, r = nums.size();
        while (l < r) {
            if (nums[l] == val) {
                nums[l] = nums[--r];
            } else {
                ++l;
            }
        }
        return l;
    }
};
复制代码

四、总结:

“不稳定”可能意味着“快”,比如知名的“快速排序”就是一种不稳定的排序算法。如此看来,如果我们牺牲掉原数据的一些性质,就有可能获得效率更高的算法。

分类:
代码人生
标签:
收藏成功!
已添加到「」, 点击更改