首先从题干中找出关键信息:
对于数组来说,在尾部进行元素的增删,时间复杂度只有o(1),但在数组中间或者开头进行元素的增删,由于涉及到元素的搬运,时间复杂度就变为o(n).因此对于一般的数组处理问题,要尽可能的在尾部对元素进行处理,这样就可以避免额外的时间复杂度。本题给的数组是已经排好序的,可以很容易的通过前后比较找出重复元素,但是这样就会导致在数组的非尾部区域进行操作,为了避免这种问题,可以将数组中的重复元素搬运到尾部进行处理,这样就会得到理想的时间复杂度。
可以使用链表中经常用到的快慢指针来求解此问题。设定一个fast和slow,分别指向索引1和0的位置,让fast在前面探路,如果找到不重复的元素,就让slow前进一个,这样fast遍历结束,[0,slow]就是不重复的元素。
C++:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n= nums.size();
if(!n) return 0;
int fast=1,slow=0;
while(fast<n)
{
if(nums[fast]!=nums[slow])
{
nums[++slow]=nums[fast]; //保证[0,slow]内无重复元素
}
fast++;
}
return slow+1;
}
};
Python:
class Solution(object):
def removeDuplicates(self, nums):
n=len(nums)
if(n==0):
return 0
fast,slow=1,0
while(fast<n):
if(nums[fast]!=nums[slow]):
slow+=1
nums[slow]=nums[fast]
fast+=1
return slow+1
原文:https://www.cnblogs.com/depth-perception/p/12465265.html