题目
给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。
将最终结果插入 nums 的前 k 个位置后返回 k 。
不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
题目分析
非常简单的一道题,官方解法是快慢指针,我的做法实际上也算是快慢指针,但是我只用了一个指针记录当前无重复数组的长度,遍历整个数组,与末端无重复数组比较
题解
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int num=1;
for(int i=1;i<nums.size();i++){
if(nums[i]!=nums[num-1]){
nums[num]=nums[i];
num++;
}
}
return num;
}
};
官方解法
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;
}
};
总结
一遍过!虽然题目超级简单,但还是很开心!
官方题解里增加了n==0的判断,但是我默认数组长度超过1,还是通过了判断,可能与测试样例有关,但以后应该记得设置这个条件,以免程序报错