关键词:数组去重
题目描述:
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return 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.
这道题需要更改原始输入的数组并且返回去重后的数组长度。
分为两部分来思考:
- 去重数组长度计算
注意到这里的输入数组是排好序的数组。所以可以用指针从头开始比较。并设置去重后的数组长度为count=0. 用count也可以作为数组的指针,来表示数组在count这个位置的数值。
肯定要遍历整个数组,用一个for循环和i指针来做。
在这里我一开始的思路是判断count指针和i指针大小,如果count指针所指的数小则将count++。最后count就是要求的数组长度。 - 更改原始输入数组
题目要求必须在原始数组上进行更改而不能新建一个数组。有一个隐含前提,去重数组的长度一定小于等于原始数组。那么,我们可以直接将大于当前指针的数放入前一个已经去重的数之后。
所以我们需要一个指针来保存去重列表的末尾部分,恰好这个指针就是count,当i指针遍历整个数组遇到一个新的数(只需要比count的大)时,可以将这个数放入count之后的格子里,直到i遍历到达了整个原始数组的尾部。
需要考虑边界条件。当输入数组nums的长度为0和1时,这个算法是否能够给出0,1的返回值?不能。count=0的初始设置在nums.length=1时还是等于0.因为count==i==0,并不会进入自增的过程。可以考虑返回count+1,然后在算法顶端加一个判断条件。数组的长度是否为0,如果是0,直接返回0就好了。
Java版本的代码如下:
public int removeDuplicates(int[] nums) {
if(nums.length == 0){
return 0;
}
int count = 0;
for(int i=1; i< nums.length; i++) {
if(nums[count] < nums[i]){
nums[count+1] = nums[i];
count++;
}
}
return count+1;
}