一、题目
二、思路
该题在408学习中,数据结构王道书课后题遇到过,所以基本的做法会,设置一个变量记录重复数个数k,重复则继续下一步,如果不重复就将该数前移k个单位。
三、题解
1.自己初步尝试
代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int k = 0;//记录向前移动多少格子
for(int i = 1; i < nums.size(); i++){
if(nums[i] == nums[i-1]){
k++;
}
nums[i-k] = nums[i];
}
return nums.size() - k;
}
};
2.看题解后尝试
官方题解给出的是双指针法,快慢指针,遇到不重复的数,慢指针走一步,并修改数据,快指针负责遍历整个数组。
代码如下(示例):
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n = nums.size();
if (n == 0) {
return 0;
}
int fast = 1, slow = 1;
while (fast < n) {
if (nums[fast] != nums[fast - 1]) {
nums[slow] = nums[fast];
++slow;
}
++fast;
}
return slow;
}
};
作者:力扣官方题解
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/solutions/728105/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
然后我又在评论区看见一种C++的其他解法:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
return distance(nums.begin(), unique(nums.begin(), nums.end()));
}
};
随后尝试一下,发现可行。搜了一下,**diatance()函数返回容器中的从开始到末尾的元素个数,而unique()**函数是一个标准库算法,它用于移除容器中相邻重复的元素,并将重复的元素移到容器的末尾,并返回一个指向不重复元素的范围的末尾迭代器。
不过好像据说这种使用库函数并不在算法中待见,所以看个乐呵就行。
总结
这题目考察双指针的基本知识,以前遇到过,所以比较熟练。