LeetCode - 解题笔记 - 80 - Remove Duplicates from Sorted Array II

Solution 1

本题可以认为是Remove Duplicates from Sorted Array的变体,主要的区别就是同类元素可以出现不超过两次。本题的框架下,相同元素必然连续分布,因此只需要判断当前元素是否和已归置部分的倒数第二个元素相同进行取舍。具体实现中,一些判定部分要因此进行调整。

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N为序列长度,线性遍历
  • 空间复杂度: O ( 1 ) O(1) O(1),仅维护常数个状态量
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int length = nums.size();
        if (length <= 2) {
            // 前两个无论怎么样都满足要求
            return length;
        }
        
        int posA = 2, posB = 2;
        // 一个是下面的判定条件从0会出问题。而从2开始则因为问题本身的性质而变得无所谓
        while (posB < length) {
            if (nums[posA - 2] != nums[posB]) {
                // 至多出现两次,必然连续出现
                nums[posA] = nums[posB];
                posA++;
            }
            posB++;
        }
        return posA;
    }
};

Solution 2

Solution 1的Python实现

class Solution:
    def removeDuplicates(self, nums: List[int]) -> int:
        length = len(nums)
        if length <= 2: return length 
        
        posA, posB = 2, 2
        
        while posB < length:
            if nums[posA - 2] != nums[posB]:
                nums[posA] = nums[posB]
                posA += 1
                
            posB += 1
            
        return posA
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值