其他分享
首页 > 其他分享> > leetcode26:删除排序数组中的重复项

leetcode26:删除排序数组中的重复项

作者:互联网

题目

思路

首先从题干中找出关键信息:

对于数组来说,在尾部进行元素的增删,时间复杂度只有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

参考

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

  2. 微信公众号:labuladong

标签:slow,nums,复杂度,元素,fast,排序,数组,leetcode26
来源: https://www.cnblogs.com/depth-perception/p/12465265.html