本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
力扣今天的每日一题和昨天类似,但是这道题的要求的修改可以是“不稳定”的,也就是元素的顺序可以改变。本来我以为今天只是昨天的简单重复,但是加上这个条件后就可以做到对特殊情况的优化,让我们一起来看看吧,LeetCode 27. 移除元素:
二、思路分析:
我们当然可以采用与昨天相同的快慢指针的方法来写,满足条件就将元素放入新数组的末尾,这样做的时间复杂度是 。我们不妨考虑一下最坏的情况,要删除的元素刚好位于数组的开始,那么我们采用快慢指针的做法需要将后面的元素全都向前移动,比如 要删除 的话需要三次赋值操作,但我们也能发现,如果直接用 覆盖 也可以得到要求的新数组,虽然不保留原来的元素顺序,而且只需要一次赋值操作。
所以我们可以每次对遍历到的新元素检查,如果等于要删除的 ,就用数组末尾的元素覆盖它,而后将要修改的数组范围缩小,在代码里表现为 --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;
}
};
四、总结:
“不稳定”可能意味着“快”,比如知名的“快速排序”就是一种不稳定的排序算法。如此看来,如果我们牺牲掉原数据的一些性质,就有可能获得效率更高的算法。