[Leetcode] 26. Remove Duplicates from Sorted Array

Description:
Given a sorted array, remove the duplicates in-place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) O ( 1 ) extra memory.

Example:

Given nums = [1,1,2], Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn’t matter what you leave beyond the new length.

Language: C++

解法一:
思路:
解读一下题目,和27题相似,还是“It doesn’t matter what you leave beyond the new length.”并且注意到很关键的是,提供的是sorted array,那么我们就想办法好好利用这个条件。
基本思想:两个指针。
与27题解法二类似,一个指针i用来遍历,一个指针k用来保证[0,k)范围内的元素都没有重复元素。要注意的是,当数组中只有一个元素时这个条件也是成立的,也就是k的初值可以设为1。接下来的问题就是我们怎么来利用这个呢?也就是说当遇到重复元素时或没有重复元素时该怎么操作呢?那么这里,就要抓住sorted array的性质。因为是排好序的,所以重复的元素一定是挨着的,不会分散在各个地方。换句话说,如果一个元素有重复元素,那么一定它的左边或右边有重复元素,这样我们就可以用一个元素和它前面一个元素作比较来看这个元素是不是重复的元素。

如果不是当前元素和它前面一个元素不同时,说明正常情况,i正常遍历,k也相应的加一,因为再次强调,k的含义是保证[0,k)范围内的元素没有重复;而当这个元素和它前面元素相同时,说明它是重复元素,此时k不动,记得res-1,表示有效长度-1,i继续遍历,直到遍历到一个和当前元素不重复元素,然后把这个不重复的元素放到当前k这个位置,k再加1,再次保证[0,k)范围内,没有重复元素。
Time: O(n) O ( n )
Space: O(1) O ( 1 )

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        if(nums.size()==1)//考虑数组中只有一个值的情况
        return 1;
        int res = nums.size();
        int k = 1;//保证[0...k)范围内的都是没有重复的,左闭右开,因为当只有一个元素的时候可以保证

        for(int i = 1; i < nums.size(); i++){
            if(nums[i]!=nums[i-1])//如果是正常的非重复元素
                nums[k++]=nums[i];//先把它赋给nums[k],然后k++
            else//遇到重复元素
                res--;
        }
        return res;
    }
};

算法细节:

  • 由于是把遍历到的元素和它前面的元素做比较,所以i的初值设为1,这里就要考虑数组中元素只有一个的极端情况了。
  • 时刻记住语句的含义!如k的含义是保证[0,k)范围内无重复元素
  • 这个算法的缺点是:如果这个数组中重复元素很少的话,这样做是很浪费时间的,因为当元素不重复的时候我们给把它赋给了nums[k],因此要对它进行改进,改进方式很简单,在for循环,赋值之前加一句k和i的判断就好了:

    
    for(int i = 1; i < nums.size(); i++){
         if(nums[i]!=nums[i-1]){//如果是正常的非重复元素
             if(k != i)
                 nums[k]=nums[i];//先把它赋给nums[k],然后k++
             k++;//只要不是重复元素,k就要+1
         }
         else//遇到重复元素
             res--;
        }

这也是没有看别人代码自己完成的题,感觉自己对两个指针的运用更熟练了呢!继续加油!

Happy Coding!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值