题目描述
在有序数组中删除重复元素,使每个数字出现且只出现1次,并返回数组的新的长度。要求:不允许申请额外空间,即要求恒定的空间复杂度。
我的解法——记录应该前移的位数
- **最好的方法!! **
- 用一个额外空间记录当前元素应该向前移的位数,这个数now随着数组往后遍历不断变化:
- 若当前元素和之前元素相等:now++
- 若当前元素和之前元素不等:now不变
- n的复杂度。
- 结果:beat 44.82%
class Solution(object):
def removeDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
now = 0
for i in range(1,len(nums)):
if(nums[i] == nums[i - 1]):
now += 1
nums[i - now] = nums[i]
return len(nums) - now
其他解法——双指针
- 采用两个指针l和r,l记录不重复元素的位置,r从l的下一个开始遍历数组,如果r位置的数字等于l位置的数字,说明该数字重复出现,不予处理;如果r位置的数字不等于l位置的数字,说明该数字没有重复,需要放到l的下一位置,并使l加1。然后用Sum Two的算法搞定。
- 一层循环,n的复杂度
class Solution
{
public:
int removeDuplicates(int A[], int n)
{
if(n == 0)
return 0;
int l = 0;
for(int r = 1; r < n; ++ r)
if(A[r] != A[l])
A[++ l] = A[r];
return l + 1;
}
};
参考答案
https://leetcode.com/problems/remove-duplicates-from-sorted-array/solution/