Leecode刷题 【1数组专题4】80. 删除排序数组中的重复项II (以及通用解法)

  • 题目:
  • 思路 双指针法:
    • (错误代码)
    • 正解:
  • 通用解法:

题目:

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

思路 双指针法:

写说一下自己最开始的思路,可能是以前嵌入式硬件编程总用标志位flag习惯了,思来想去,没想到别的,居然还是用了设置一个计数cnt和flag标志位。非常不出意外的,最后运行成功了18个例子之后,失败了,

(错误代码)

int removeDuplicates(int* nums, int numsSize){int fast = 0,slow = 0;int cnt = 0,flag = 0;for(int i = 0;i < numsSize;i++){if(nums[fast] == nums[slow]){cnt++;flag = 1;if(cnt >= 3){flag = 0;cnt = 0;}}if(nums[fast] != nums[slow] || (flag == 1 && nums[fast] == nums[slow]) ){int temp = nums[fast];nums[fast] = nums[slow];nums[slow++] = temp;}fast++;}return slow;
}

已经不知道问题出在哪儿,有点怪异,这个3,按理说不应该没有啊???

正解:

具体地,我们定义两个指针 slow 和 fast 分别为慢指针和快指针,其中慢指针表示处理出的数组的长度,快指针表示已经检查过的数组的长度,即 nums[fast] 表示待检查的第一个元素,nums[slow−1] 为上一个应该被保留的元素所移动到的指定位置。

因为本题要求相同元素最多出现两次而非一次,所以我们需要检查上上个应该被保留的元素 nums[slow−2]是否和当前待检查元素 nums[fast]相同。当且仅当 nums[slow−2]=nums[fast]时,当前待检查元素 nums[fast]不应该被保留(因为此时必然有 nums[slow−2]=nums[slow−1]=nums[fast])。最后,slow 即为处理好的数组的长度。

特别地,数组的前两个数必然可以被保留,因此对于长度不超过 222 的数组,我们无需进行任何处理,对于长度超过 222 的数组,我们直接将双指针的初始值设为 222 即可。

int removeDuplicates(int* nums, int numsSize){int index = 0;for(int i = 0;i < numsSize;i++){if(nums[i] != nums[index])nums[++index] = nums[i];}return index+1;
}

通用解法:

已经做了好几道这个删除题了,为了让解法更具有一般性,我们将原问题的「保留 2 位」修改为「保留 k 位」。
对于此类问题,我们应该进行如下考虑:

  • 由于是保留 k 个相同数字,对于前 k 个数字,我们可以直接保留
  • 对于后面的任意数字,能够保留的前提是:与当前写入的位置前面的第 k 个元素进行比较,不相同则保留
    比如,我们令 k=2,假设有如下样例
    [1,1,1,1,1,1,2,2,2,2,2,2,3]
  1. 首先我们先让前 2 位直接保留,得到 1,1
  2. 对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面 k 个元素不同(答案中的第一个 1),因此我们会跳过剩余的 1,将第一个 2 追加,得到 1,1,2
  3. 继续这个过程,这时候是和答案中的第 2 个 1 进行对比,因此可以得到 1,1,2,2
  4. 这时候和答案中的第 1 个 2 比较,只有与其不同的元素能追加到答案,因此剩余的 2 被跳过,3 被追加到答案:1,1,2,2,3

这是一种针对「数据有序,相同元素保留 k 位」问题更加本质的解法,该解法是从性质出发提炼的,利用了「数组有序 & 保留逻辑」两大主要性质。

class Solution {public int removeDuplicates(int[] nums) {   return process(nums, 2);}int process(int[] nums, int k) {int u = 0; for (int x : nums) {if (u < k || nums[u - k] != x) nums[u++] = x;}return u;}
}作者:宫水三叶
链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array-ii/solutions/702970/gong-shui-san-xie-guan-yu-shan-chu-you-x-glnq/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Leecode刷题【1数组专题4】80. 删除排序数组中的重复项II (以及通用解法)相关推荐

  1. 每日一题——删除排序链表中的重复项 II

    菜鸡每日一题系列打卡82天 每天一道算法题目 小伙伴们一起留言打卡 坚持就是胜利,我们一起努力! 题目描述(引自LeetCode) 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重 ...

  2. list元素求和_LeetCode刷题实战82:删除排序链表中的重复元素 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  3. leetcode算法题--删除排序链表中的重复元素 II

    原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 1.map ListNode* deleteD ...

  4. 每日一题:leetcode82. 删除排序链表中的重复元素 II

    题目描述 题目分析 这才是正常的中等题难度嘛,昨天的中等题题解我半天看不懂... 首先,需要增加一个哑节点(操作链表的常规操作),因为有可能删除首节点,我们不想要为首节点添加单独的逻辑.其次,用一个变 ...

  5. Leetcode 82. 删除排序链表中的重复元素 II (每日一题 20210908)

    存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字.返回同样按升序排列的结果链表.示例 1:输入:head = ...

  6. LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  7. 80. 删除有序数组中的重复项 II

    80. 删除有序数组中的重复项 II Ideas 没啥技术含量,从后往前,check+delete. Code Python class Solution:def removeDuplicates(s ...

  8. 80. 删除排序数组中的重复项 II golang

    80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...

  9. go数组去除重复_让我们一起啃算法----删除排序链表中的重复元素

    删除排序链表中的重复元素(Remove-Duplicates-From-Sorted-List) 题干: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1-> ...

最新文章

  1. 实战脚本写入注册表,完善WindowsServer自动化运维
  2. 禁止ping入自己的主机
  3. 可靠性不是测试出来的,是设计出来的!
  4. 使用七牛图片遇到的图片方向翻转问题
  5. postman跨域测试_安装使用Hoppscotch构建API请求访问与测试
  6. 信安教程第二版-第16章网络安全风险评估技术原理与应用
  7. 视频(avi)转换为图片(Python代码实现)
  8. Android 应用开发(12)---可绘制对象资源
  9. 爽到爆!阿里腾讯都在用的API管理神器,API文档、测试、Mock全搞定
  10. vSphere 7 With K8s系列07:客户端工具使用
  11. 第一:Python安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
  12. 看图说说class文件结构(部分)
  13. Python入门--字符串的编码与解码
  14. python关键字参数顺序_位置参数和关键字参数的求值顺序
  15. TensorFlow 2.0源码编译步骤
  16. Windows 10一周年更新版本号将锁定为Build 14393
  17. php获取省市区区划代码,使用PHP解析行政区划代码
  18. python身份证号查询信息
  19. plm系统 服务器不存在,PLM服务器和客户端使用方式
  20. 在线计算机免费课程表,Simple课程表

热门文章

  1. 哈佛结构和冯·诺依曼结构的区别【转】
  2. 分享30个非常实用的游戏和应用源码
  3. 画论09 李嗣真《续画品录》
  4. 2021年危险化学品经营单位安全管理人员试题及解析及危险化学品经营单位安全管理人员作业考试题库
  5. 【转贴】《阿凡达》观影记 72小时北京惊魂
  6. Matlab 算数学题 -- 空间曲线求切线和法向量
  7. android仿钉钉头像,仿钉钉群聊头像的实现
  8. Ansible(1) Centos7安装Ansible
  9. Philips飞利浦 Sonicare E系列电动牙刷替换刷头
  10. 攻防世界 crypto---simpleRSA wp