本文正在参与掘金团队号上线活动,点击 查看大厂春招职位
一、题目描述:
星期天到了,又到了 LeetCode 每日一道简单题的时候了。今天的每日一题,刚好我一年前也做过,所以今天不妨给它写篇题解吧。LeetCode 26. 删除有序数组中的重复项:
二、思路分析:
如果题目要求的不是原地修改,我们可以创建一个新的 vector
,然后循环遍历一遍原数组,如果新 vector
为空或者当前元素和 vector
的末尾不相等就将其 push_back()
进去。但是题目要求的是原地修改,我们可以使用双指针的方法,用一个指针 表示新数组的末尾下标,用一个指针 表示原数组遍历到的元素下标,因为新数组的长度总是小于等于原数组,所以 和 不会相互影响。
三、AC 代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int l = 0, r = 0, n = nums.size();
while (r < n) {
int val = nums[r];
while (r < n && nums[r] == val) {
++r;
}
nums[l++] = val;
}
return l;
}
};
复制代码
四、总结:
删除有序数组中的重复项虽然简单,但是在处理离散化的时候是必不可少的。如果要处理的数据范围过大,而数据的数量却是可以接受的,我们就可以考虑将数据进行排序,然后删除重复项,再将元素和小范围的下标建立映射,对于有些题目这种做法可以优化时空复杂度,但那就是另外一个故事了。