删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法1
用双指针解决移动元素的问题:
0.长度不足1直接返回长度
1.fast指向的是待检查元素,slow指向的是将要被替换的元素(即正确元素所在位置的下一位)
2.待检查的元素不等于前一个元素时,说明其是一个新出现的不重复的元素,将其替换到slow slow++ fast++
3.待检查的元素等于前一个元素,不进行替换,继续检查 fast++
4.slow指向正确位置下一位 返回时返回正确位置slow-1 但需要返回的是长度而不是下标所以还要+1。也就是直接返回slow即可
代码:
public int removeDuplicates(int[] nums){
int n = nums.length;
if(nums.length < 2){
return 1;
}
int fast = 1,slow = 1;
while(fast < n){
if(nums[fast] != nums[fast-1]){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
方法2
因为只考虑正确元素即可,在重复元素出现之后的正确元素,之前有几个重复元素,就前移多少位,可不使用双指针获得更快的速度
1.遍历一遍数组
2.用total记录重复元素
3.不是重复元素时,当前元素前移total位进行覆盖
4.返回总长-total
代码:
public static int removeDuplicates2(int[] nums){
int res = nums.length;
int total = 0;
if(nums.length <= 1){
return 1;
}
for (int i = 1; i<nums.length; i++) {
if(nums[i] != nums[i - 1]){
nums[i - total] = nums[i];
}else{
total++;
}
}
return res - total;
}
浙公网安备 33010602011771号