删除有序数组中的重复项
方法一:自己写的答案
思路:
- 把数组的长度赋值给len
- 进入循环,不是最后一个值则判断是否重复,重复则将后续的值依次往前挪,将重复值覆盖,len–
- nums[j]–的原因时,j-1当前已经时最后一个值的索引了,但是后续数值并没有删除,当nums[j-1]==nums[j]的时候将会陷入死循环,所以需要修改后续的值,至于为什么是自减1,是因为给数组是递增的,自减1才不会与前面的值重复
- 同时考虑可能有多个重复值,使用while循环
- 返回len
class Solution {
public int removeDuplicates(int[] nums) {
int len = nums.length;
for (int i=0;i<len;i++){
if (i<len-1) {
while (nums[i]==nums[i+1]){
int j = i+1;
while (j<len-1){
nums[j] = nums[j+1];
j++;
}
nums[j]--;
len--;
}
}
}
return len;
}
}
方法二:看了下评论区的c++答案,使用java实现
思路:利用一个新的索引len抽象出一个新的数组
- 将len=0,即给虚拟新数组nums[0]赋值,因为nums不用考虑是否重复,可以直接赋值
- 将索引1及后面的值,都与nums[len]比较,如果不重复,则将给nums[len+1]赋值当前nums[i]的值,如果重复,不做操作,相当于没有给新数组加入重复值,同时保持len的值时虚拟数组最后一个值的索引
- 由于数组长度为数组最后一个值的索引+1,返回len+1
class Solution {
public int removeDuplicates(int[] nums) {
if (nums.length<2) return nums.length;
int len = 0;
for (int i=1;i<nums.length;i++){
if (nums[len]!=nums[i]) nums[++len] = nums[i];
}
return ++len;
}
}