给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
示例 1:
给定数组 nums = [1,1,2],
函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1,2
。
你不需要考虑数组中超出新长度后面的元素。
class Solution {
public:
// 6)插入元素: vec.insert(vec.begin()+i,a);在第i+1个元素前面插入a;
// 7)删除元素: vec.erase(vec.begin()+2);删除第3个元素
int removeDuplicates(vector<int>& nums) {
if(nums.size()==0)
return 0;
if(nums.size()==1)
return 1;
int n=nums[0];
for(int i=1;i<nums.size();i++){
if(n==nums[i]){
i--;
nums.erase(nums.begin()+i);
}
else{
n=nums[i];
}
}
return nums.size();
}
};
java 实现 思路
设立 一个区域【start end (储存着元素下标)】 保存着重复元素 并且将该区域一点点的移动到数组尾部
import java.util.Arrays;
class Solution {
public int removeDuplicates(int[] nums) {
//Arrays.sort(m);
if(nums.length==1 )
return 1;
if(nums.length==0 )
return 0;
int start=-1;
int end = -1;
//已知数组是升序
//record记录前一个数值 当前数值为nums[i]
int record =nums[0];
for(int i = 1; i < nums.length; i++){
int temp;
//遇到重复元素
if( nums[i] == record){
// start end 为-1 意味着首次添加元素
if(start == -1 && end == -1)
{
start = i;
end = i;
}
//扩展 重复元素区域
else{
end +=1;
}
}
//将该区域右移一位
if( i-1 == end )
{
record = nums[i];
temp = nums[start];
nums[start] = nums[i];
nums[i] = temp;
start += 1;
end +=1;
}
else{
record = nums[i];
}
}
if(start!=-1)
nums = Arrays.copyOfRange(nums,0,start);
return nums.length;
}
}