MENU

LeetCode80. Remove Duplicates from Sorted Array II(模拟)

2019 年 02 月 01 日 • 阅读: 965 • LeetCode阅读设置

LeetCode80. Remove Duplicates from Sorted Array II(模拟)

  • Medium
  • Accepted:184,103
  • Submissions:469,054

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.

Example 2:

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

Your function should return length = 7, with the first seven elements of nums being modified to 0, 0, 1, 1, 2, 3 and 3 respectively.

It doesn't matter what values are set beyond the returned length.

Clarification:

Confused why the returned value is an integer but your answer is an array?

Note that the input array is passed in by reference, which means modification to the input array will be known to the caller as well.

Internally you can think of this:

// nums is passed in by reference. (i.e., without making a copy)
int len = removeDuplicates(nums);

// any modification to nums in your function would be known by the caller.
// using the length returned by your function, it prints the first len elements.
for (int i = 0; i < len; i++) {
    print(nums[i]);
}

链接

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

题意

给定一个数组,去除其中的重复元素,并返回新数组的长度,规则是一个元素最多可以出现两次,且不允许使用

数组。

题解

如果没有规定元素最多可以出现两次的话,那么就是这道题:LeetCode26. Remove Duplicates from Sorted Array(模拟)

其实加了这个条件后也很简单,我们只需要再加一个标记flag,如果出现重复元素且flag为true的话就加入新数组,并让flag赋值为false,就相当于第一次出现某个重复元素。如果当前元素不等于前一个元素时,就让flag赋值为true,表示对新元素的判断。遍历一次即可完成,时间复杂度$O(n)$,

代码

  • Runtime: 8 ms, faster than 100.00% of C++ online submissions for Remove Duplicates from Sorted Array II.
class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int len = nums.size();
        int cnt = (len == 0 ? 0 : 1);
        bool flag = true;
        for (int i = 1; i < len; ++i)
        {
            // 第一次出现重复元素符合要求
            if (nums[i] == nums[i-1] && flag)
            {
                nums[cnt++] = nums[i];
                flag = false;
            }
            if (nums[i] != nums[i-1])
            {
                nums[cnt++] = nums[i];
                flag = true;
            }
        }
        return cnt;
    }
};

同样不要忘记对空数组的判断。


The end.

2019年2月1日 星期五