赞
踩
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array
示例 1:
输入:nums = [1,1,2]
输出:2, nums = [1,2]
解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。
示例 2:
输入:nums = [1,,2,,3,4]
输出:4, nums = [1,2,3,4]
解释:函数应该返回新的长度 4 , 并且原数组 nums 的前四个元素被修改为 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。```
源代码:
class Solution { public int removeDuplicates(int[] nums) { //先判断是否为空或长度为1 if(nums == null ||nums.length == 1){ return nums.length; } //创建两个指针 int p = 0,q = 1; //当还没有循环完所有的数字时 while(q < nums.length){ //如果后面的数字和前面的一样,就将后面的指针后移一位 if(nums[p] == nums[q]){ q ++; }else{ //如果后面的比前面的大则前面指针往前移一位 // 并将后面的值赋值给前面,然后后指针后移一位 p ++; nums[p] = nums[q]; q ++; } } //返回的是前指针加一 return p+1; } }
简化一下:
class Solution {
public int removeDuplicates(int[] nums) {
int n = nums.length;
int j = 0;
for(int i = 1;i < n;i ++){
if(nums[i] != nums[j]){
nums[++j] = nums[i];
}
}
return j + 1;
}
}
源代码:

简化后:

详细可看:【宫水三叶】一题双解
作者:AC_OIer
链接:详细解释
举个例子,我们令 k=1,假设有样例:[3,3,3,3,4,4,4,5,5,5]
设定变量 idx,指向待插入位置。idx 初始值为 0,目标数组为 []
首先我们先让第 1 位直接保留(性质 1)。idx 变为 1,目标数组为 [3]
继续往后遍历,能够保留的前提是与 idx 的前面 1 位元素不同(性质 2),因此我们会跳过剩余的 3,将第一个 4 追加进去。idx 变为 2,目标数组为 [3,4]
继续这个过程,跳过剩余的 4,将第一个 5 追加进去。idx 变为 3,目标数组为 [3,4,5]
当整个数组被扫描完,最终我们得到了目标数组 [3,4,5] 和 答案 idx 为 3。
class Solution { public int removeDuplicates(int[] nums) { int index = 0,k = 1; for(int x : nums){ //每次取出一个数,然后跟前面的数判断,如果相同则保留,不同则舍弃 //比如输入[1,2,3,4] //开始的时候,0<1,故nums[0] = 1;index = 1; //nums[1-1] != 2,故nums[1] = 2;index = 2; //nums[2-1] != 3,故nums[2] = 3;index = 3; //nums[3-1] != 4,故nums[3] = 4;index = 4; //返回4 if(index < k || nums[index - k] != x ) nums[index++] = x; } return index; } }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。