返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++实现LeetCode(80.有序数组中去除重复项之二)
  • 374
分享到

C++实现LeetCode(80.有序数组中去除重复项之二)

2024-04-02 19:04:59 374人浏览 八月长安
摘要

[LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项之二 Given a sorted array

[LeetCode] 80. 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.

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]);
}

这道题是之前那道 Remove Duplicates from Sorted Array 的拓展,这里允许最多重复的次数是两次,那么可以用一个变量 cnt 来记录还允许有几次重复,cnt 初始化为1,如果出现过一次重复,则 cnt 递减1,那么下次再出现重复,快指针直接前进一步,如果这时候不是重复的,则 cnt 恢复1,由于整个数组是有序的,所以一旦出现不重复的数,则一定比这个数大,此数之后不会再有重复项。理清了上面的思路,则代码很好写了:

解法一:


class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int pre = 0, cur = 1, cnt = 1, n = nums.size();
        while (cur < n) {
            if (nums[pre] == nums[cur] && cnt == 0) ++cur;
            else {
                if (nums[pre] == nums[cur]) --cnt;
                else cnt = 1;
                nums[++pre] = nums[cur++];
            }
        }
        return nums.empty() ? 0 : pre + 1;
    }
};

这里其实也可以用类似于 Remove Duplicates from Sorted Array 中的解法三的模版,由于这里最多允许两次重复,那么当前的数字 num 只要跟上上个覆盖位置的数字 nusm[i-2] 比较,若 num 较大,则绝不会出现第三个重复数字(前提是数组是有序的),这样的话根本不需要管 nums[i-1] 是否重复,只要将重复个数控制在2个以内就可以了,参见代码如下:

解法二:


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

到此这篇关于c++实现LeetCode(80.有序数组中去除重复项之二)的文章就介绍到这了,更多相关C++实现有序数组中去除重复项之二内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++实现LeetCode(80.有序数组中去除重复项之二)

本文链接: https://lsjlt.com/news/130685.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++实现LeetCode(80.有序数组中去除重复项之二)
    [LeetCode] 80. Remove Duplicates from Sorted Array II 有序数组中去除重复项之二 Given a sorted array...
    99+
    2024-04-02
  • C++实现LeetCode(26.有序数组中去除重复项)
    [LeetCode] 26. Remove Duplicates from Sorted Array 有序数组中去除重复项 Given a sorted array num...
    99+
    2024-04-02
  • C++实现LeetCode(82.移除有序链表中的重复项之二)
    [LeetCode] 82. Remove Duplicates from Sorted List II 移除有序链表中的重复项之二 Given a sorted linked li...
    99+
    2024-04-02
  • C++实现LeetCode(83.移除有序链表中的重复项)
    [LeetCode] 83. Remove Duplicates from Sorted List 移除有序链表中的重复项 Given a sorted linked list, d...
    99+
    2024-04-02
  • C++实现LeetCode(167.两数之和之二 - 输入数组有序)
    [LeetCode] 167.Two Sum II - Input array is sorted 两数之和之二 - 输入数组有序 Given an array of integer...
    99+
    2024-04-02
  • C++实现LeetCode(81.在旋转有序数组中搜索之二)
    [LeetCode] 81. Search in Rotated Sorted Array II 在旋转有序数组中搜索之二 Suppose an array sorted in as...
    99+
    2024-04-02
  • LeetCode中怎样删除排序数组中的重复项
    本篇文章给大家分享的是有关LeetCode中怎样删除排序数组中的重复项,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 1class Solution { 2...
    99+
    2023-06-19
  • JavaScript删除有序数组中的重复项
    如果有一个有序数组 nums ,要求原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 不要使用额外的数组空间,必须在 原地 修改输入数组 并在使用 O(...
    99+
    2024-04-02
  • C++中怎么利用LeetCode移除有序链表中的重复项
    C++中怎么利用LeetCode移除有序链表中的重复项,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。[LeetCode] 83. Remove Duplicates from ...
    99+
    2023-06-20
  • C++实现LeetCode(154.寻找旋转有序数组的最小值之二)
    [LeetCode] 154. Find Minimum in Rotated Sorted Array II 寻找旋转有序数组的最小值之二 Suppose an array sor...
    99+
    2024-04-02
  • 删除排序数组中的重复项
    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。示例 1:给定数组 nums = [1,1,2],&...
    99+
    2023-06-02
  • php中一维数组如何去除重复项
    这篇文章主要介绍php中一维数组如何去除重复项,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php一维数组去除重复值的方法:首先创建一个PHP示例文件;然后定义一个一维数组;最后通过“array_unique($ar...
    99+
    2023-06-08
  • JavaScript怎么删除有序数组中的重复项
    本文小编为大家详细介绍“JavaScript怎么删除有序数组中的重复项”,内容详细,步骤清晰,细节处理妥当,希望这篇“JavaScript怎么删除有序数组中的重复项”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如...
    99+
    2023-06-29
  • C#中怎么删除数组重复项
    今天就跟大家聊聊有关C#中怎么删除数组重复项,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。C#删除数组重复项使用C#查找数据中重复数据,C#删除数组重复项的解决方法。个人感觉,如果在...
    99+
    2023-06-17
  • C语言 详解如何删除有序数组中的重复项
    目录删除有序数组中的重复项Ⅰa.思路b.图解c.代码d.思考删除有序数组中的重复项Ⅱa.思路b.图解c.代码d.思考删除有序数组中的重复项Ⅰ a.思路 ⭐定义变量 int des...
    99+
    2024-04-02
  • java算法入门之有效的括号删除有序数组中的重复项实现strStr
    目录1、LeetCode 20.有效的括号题目小编菜解思路及算法大神解法2、LeetCode 26.删除有序数组中的重复项题目小编菜解初版小编菜解改进版思路及算法大神解法3、Leet...
    99+
    2024-04-02
  • js中如何实现两数组去除重复数值
    这篇文章主要介绍js中如何实现两数组去除重复数值,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!实例如下://两数组去除重复数值 mergeArray: function(a...
    99+
    2024-04-02
  • C++实现LeetCode(两个有序数组的中位数)
    [LeetCode] 4. Median of Two Sorted Arrays 两个有序数组的中位数 There are two sorted arrays nums1...
    99+
    2024-04-02
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)
    [LeetCode] 108.Convert Sorted Array to Binary Search Tree 将有序数组转为二叉搜索树 Given an array wher&...
    99+
    2024-04-02
  • C++实现LeetCode(768.可排序的最大块数之二)
    [LeetCode] 768.Max Chunks To Make Sorted II 可排序的最大块数之二 This question is the same as "Max Ch...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作