给定一个排序数组,你需要在 原地 删除重复出现的元素,
使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组
并在使用O(1)额外空间的条件下完成。
我的思路:
原地删除,不用将原数组的空间缩小,所采用的是将数组的前面部份更新为不重复的子数组然后得到该部分的长度,
这样通过长度可以取到子数组。从而实现了题意。
使用双指针,left和right,left指向0,right指向1位置。
在一个while(1)循环中,如果right等于了数组的长度,说明遍历完成,此时返回0至left位置的长度。
如果right没有遍历完,则分为两种情况,一种是right遇到了重复的数,一种是遇到了不重复的数。
可以定义一个int变量tmp,tmp由nums[left]
赋值,right每移动到一个位置,nums[right]
就要和tmp比较,如果和tmp相等,说明遇到了重复的数。
如果不等,则说明遇到了不重复的数,此时更新tmp,同时将left++,并将nums[right]
赋给nums[left]
,这样就完成了移除重复元素。
代码如下:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int len = nums.size();
if(len == 0|| len == 1) return len;
int left=0;
int right=1;
int tmp = nums[left];
while(1){
if(right == len){
return left+1;
}
else if(nums[right] == tmp){
right++;
}else{
left++;
nums[left] = nums[right];
tmp = nums[left];
right++;
}
}
}
};
while(1)和while(true),leetcode的后者反而需要更多的时间开销。