leetcode26-删除排序数组中的重复项(c++/python)
题目

思路
首先从题干中找出关键信息:
- 排序数组
- 原地删除
- 不使用额外的数组空间
对于数组来说,在尾部进行元素的增删,时间复杂度只有o(1),但在数组中间或者开头进行元素的增删,由于涉及到元素的搬运,时间复杂度就变为o(n).因此对于一般的数组处理问题,要尽可能的在尾部对元素进行处理,这样就可以避免额外的时间复杂度。本题给的数组是已经排好序的,可以很容易的通过前后比较找出重复元素,如果直接将重复元素删除,涉及到元素的搬运,时间复杂度过高,因此可以尝试将数组中的重复元素搬运到尾部进行处理。
如何求解本题呢?可以借鉴上述思路,尽量把重复的元素放到后面。由此可以衍生出此类问题的一种通用求解方式:快慢指针。设定一个fast和slow,分别指向索引1和0的位置,让fast在前面探路,如果找到不重复的元素,就让slow前进一个,这样fast遍历结束,nums[0~slow]就是不重复的元素,剩余的元素就是重复元素。
题解
C++:
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int n= nums.size();
if(n==0) 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

浙公网安备 33010602011771号