昨天那两个太简单了,不写了,注意复习一下链表的操作就好了。
今天这个也不应该写的,有点zz
考虑到要返回结果,第一反应是用迭代器遍历
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
if(nums.size() == 0) return 0;
vector<int>::iterator ite = nums.begin() + 1;
int ans = 1;
while(ite != nums.end()){
if(*ite == *(ite - 1)) nums.erase(ite);
else{
ite++;
ans++;
}
}
return ans;
}
};
但是提交之后发现,怎么有90的人比我的代码速度要快啊?emmmm...
后来发现一行字,“你不需要考虑数组中超出新长度后面的元素”...
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int ans = 0;
for(int i = 0; i < nums.size(); i++){
if(i == 0 || nums[i] != nums[ans - 1]) nums[ans++] = nums[i];
}
return ans;
}
};
想不出更快的了
在这里再说一下27,跟26的问题差不多,移除等于val的元素。在需要删除的数很少的时候,双指针可以从两端开始扫
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int n = nums.size();
int i = 0;
while(i < n){
if(nums[i] == val){
nums[i] = nums[n - 1];
n--;
}
else i++;
}
return n;
}
};
不过从题目给的数据上来看效率差距不大,但是在数据量非常大的情况下还是节省了不少时间