题目描述
Given a sorted array nums, remove the duplicates in-place such that each element appears only once and returns the new length.
Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.
样例描述
Example 1:
Input: nums = [1,1,2]
Output: 2, nums = [1,2]
Explanation: Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the returned length.
Example 2:
Input: nums = [0,0,1,1,1,2,2,3,3,4]
Output: 5, nums = [0,1,2,3,4]
Explanation: Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. It doesn't matter what values are set beyond the returned length.
Constraints:
0 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums is sorted in ascending order.
思路
- 双指针法,一个是慢指针
i
,一个是快指针j
,只要两个指针指向的数相同,就让快指针往后走,直到不同的(即非重复项),然后将这项赋值到i指针的后面一项,不断重复这个过程知道j到达数组末尾 - 注意最后返回的是
i+1
,因为整个数组最少有一项(全部都是重复项的情况)
代码
class Solution {
public int removeDuplicates(int[] nums) {
int i = 0;
for (int j = 1; j < nums.length; j++){
//找到非重复项,就把该项赋值到i的后面那项
if (nums[j] != nums[i]){
i++;
nums[i] = nums[j];
}
}
return i+1; //加1是因为i初始为0,但是显然整个数组最少有一个数(全部重复的情况)
}
}