给你一个 升序排列 的数组 nums
,请你 原地删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。
不要使用额外的空间,你必须在 原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
class Solution {
public int removeDuplicates(int[] nums) {
if (nums== null || nums.length == 0) { //边界条件
return 0;
}
int i=0;
for(int j = 1; j < nums.length; j++){ //右指针始终向右移动,而左指针在特定条件下才会移动
//如果左指针和右指针指向的值一样,说明有重复的,
//这个时候,左指针不动,右指针继续往右移。如果他俩
//指向的值不一样就把右指针指向的值往前挪
if(nums[i] != nums[j]){
i = i + 1;
nums[i] = nums[j];
}
}
return i+1;
}
}
涉及知识点:使用双指针解决问题
使用两个指针,右指针始终往右移动
- 如果右指针指向的值等于左指针指向的值,左指针不动。
如果右指针指向的值不等于左指针指向的值,那么左指针往右移一步,然后再把右指针指向的值赋给左指针。
第二种解题方式:
class Solution {
public int removeDuplicates(int[] A) {
int count = 0;//重复的数字个数
for (int right = 1; right < A.length; right++) {
if (A[right] == A[right - 1]) {
//如果有重复的,count要加1
count++;
} else {
//如果没有重复,后面的就往前挪
A[right - count] = A[right];
}
}
//数组的长度减去重复的个数
return A.length - count;
}
}
这里的count用于计数,先确定有多少个值是重复的,再将后面不重复的值赋值给前面应该修改的值
版权声明:本文为m0_58022371原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。