leetcode80. Remove Duplicates from Sorted Array II

题目描述

Given a sorted array nums, remove the duplicates in-place such that duplicates appeared at most twice 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) extra memory.

Example 1:

Given nums = [1,1,1,2,2,3],

Your function should return length = 5, with the first five elements of nums being 1, 1, 2, 2 and 3 respectively.

It doesn’t matter what you leave beyond the returned length.

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

代码

与26题一同理解。80在26基础上要求最多保留2个相同元素,故用count记录相同元素个数

#include "pch.h"
#include <iostream>
#include <vector>

using namespace std;


class Solution {
public:
	int removeDuplicates(vector<int>& nums) {
		if (nums.size() == 0)
			return 0;
		int j = 1;
		int count = 1;
		for (int i = 1; i < nums.size(); i++)
		{
			if (nums[i] == nums[i - 1])
			{
				count++;
				if (count < 3)
				{
					nums[j] = nums[i];
					j++;
				}
			}
			else {
				count = 1;
				nums[j] = nums[i];
				j++;
			}
		}
		return j;

	}
};

int main()
{
	vector<int> nums = { 1,1,1,2,2,3};
	cout << Solution().removeDuplicates(nums) << endl;
	return 0;
}

进阶版一

len
表示的是删除重复元素后新序列的长度,同时也表示新元素进入新序列的索引;

i
就是循环变量,用于遍历整个旧序列;

if (len < 2) nums[len++] = nums[i];
意思就是如果新序列的长度小于2(即新序列中不会存在两个相同的元素,这时候i位置所在元素不会和新序列中的元素相同),直接将新元素加入到新序列中,并更新新序列的长度;

if (nums[i] != nums[len-2]) nums[len++] = nums[i];
意思就是如果新元素加入后不会和前两个元素构成3个相同的元素(nums[len-2]就是直接取新序列中倒数第二个元素,如果该元素和新元素相同,说明加入后会构成3个相同的元素,显然是不符合题意的),就将新元素加入到新序列中,并更新新序列的长度;

题意只要求将新序列紧挨在一起就行,多出的长度将不参与评测;

class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (len < 2 || nums[i] != nums[len-2])
                nums[len++] = nums[i];
        }
        return len;
    }
};

进阶版二

#include <iostream>
#include <vector>

using namespace std;

/// Ad-Hoc
/// Time Complexity: O(n)
/// Space Complexity: O(1)
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {

        int i = 0;
        int j = 0;
        while(j < nums.size()){
            int k = nextIndex(nums, j);
            int len = min( 2, k-j);
            for(int ii = 0 ; ii < len ; ii ++)
                nums[i+ii] = nums[j];
            i += len;
            j = k;
        }

        return i;
    }

private:
    int nextIndex(const vector<int>& nums, int index){
        for(int i = index ; i < nums.size() ; i ++)
            if(nums[i] != nums[index])
                return i;
        return nums.size();
    }
};


int main() {

    vector<int> nums1 = {1, 1, 1, 2, 2, 3};
    cout << Solution().removeDuplicates(nums1) << endl;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值