删除排序数组中的重复项
题目要求
给你一个有序数组 nums ,请你“原地”删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在“原地”修改输入数组 并在使用 O(1) 额外空间的条件下完成。
示例
-
示例 1:
输入:nums = [1,1,2]
输出:2 -
示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5
思路
- 在此题中,我们可以了解到,此题不能使用额外的数组空间,只能原地修改数组中的元素,以来达到要求。
- 又因为此题中的数组为有序数组,且去重后的数组总是<=原数组,所以我们可以使用双指针直接在原数组进行修改。
- 定义left、right指针,当右边的元素和左边的元素"!="时,我们就将右边当前下标的元素赋值数组(left+1)下标所在的位置,显而易见,left永远小于或等于right,数组下标不会越界。
public static int removeDuplicates(int[] nums) {
if(nums.length==0||nums==null) {
return 0;
}
int left=0;
for(int right=1;right<nums.length;right++) {
if(nums[left]!=nums[right]) {
//此处需要先左指针++,再赋值
nums[++left]=nums[right];
}
}
//因为left是从下标0开始的,当数组去重后,共有(left+1)个数
return left+1;
}