leetcode-80-Remove Duplicates from Sorted Array II 顺序表

问题

题目:[leetcode-80]

思路

本质和25,26一个思路。但是我第一遍没有过。说说我的问题,
不是每次循环都有nums[i-k] = nums[i]的。这样的结果会导致[1,1,1]这样的测试用例过不去,因为output中包含了1这个元素。

所以,整体的逻辑分两部分。

  • 重复元素累加k
  • 非重复元素进行赋值

代码(c++实现)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int sz = nums.size();
        int k = 0;
        map< int, int > mapper;

        for( int i = 0; i < sz; ++i )
        {
            if( mapper.find( nums[i] ) == mapper.end() )
            {
                mapper[nums[i]] = 1;
                nums[i-k] = nums[i];
            }
            else if( 1 == mapper[ nums[i] ]  )
            {
                ++mapper[nums[i]];
                nums[i-k] = nums[i];
            }
            else
                ++k;
        }

        return sz-k;
    }
};

上面是第一版的代码,看了看其他人的代码。觉得自己的代码只是解决了问题,但是没有更好的考察问题本省的特性。忽略了Sorted Array这一重要特性。因为元素是有序的,所以本质还是不需要增加一个hashmap的,其实一个变量就够了。
重复元素至多有两个,所以在原数组里面只要nums[i] != nums[i-2]就能保证这个元素不重复。但是,对于下面这组输入则不行。

Input:
[1,1,1,2,2,3]
Output:
[1,1,2,3]
Expected:
[1,1,2,2,3]

原因在于,原数组是会被修改的。所以原数组nums[i-2]的元素,在输出数组中应该是nums[i-2-k]这个元素。

代码1(c++实现)

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int sz = nums.size();
        int k = 0;

        for( int i = 2; i < sz; ++i )
        {
            if( nums[i] != nums[i-2-k] )
                nums[i-k] = nums[i];
            else
                ++k;

        }
        return sz - k;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值