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

参考

  1. https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

  2. 微信公众号:labuladong

posted @ 2020-03-11 20:47  depth-perception  阅读(149)  评论(0)    收藏  举报