Leecode刷题【1数组专题4】80. 删除排序数组中的重复项II (以及通用解法)
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]
- 首先我们先让前 2 位直接保留,得到 1,1
- 对后面的每一位进行继续遍历,能够保留的前提是与当前位置的前面 k 个元素不同(答案中的第一个 1),因此我们会跳过剩余的 1,将第一个 2 追加,得到 1,1,2
- 继续这个过程,这时候是和答案中的第 2 个 1 进行对比,因此可以得到 1,1,2,2
- 这时候和答案中的第 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 (以及通用解法)相关推荐
- 每日一题——删除排序链表中的重复项 II
菜鸡每日一题系列打卡82天 每天一道算法题目 小伙伴们一起留言打卡 坚持就是胜利,我们一起努力! 题目描述(引自LeetCode) 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有重 ...
- list元素求和_LeetCode刷题实战82:删除排序链表中的重复元素 II
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...
- leetcode算法题--删除排序链表中的重复元素 II
原题链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-list-ii/ 1.map ListNode* deleteD ...
- 每日一题:leetcode82. 删除排序链表中的重复元素 II
题目描述 题目分析 这才是正常的中等题难度嘛,昨天的中等题题解我半天看不懂... 首先,需要增加一个哑节点(操作链表的常规操作),因为有可能删除首节点,我们不想要为首节点添加单独的逻辑.其次,用一个变 ...
- Leetcode 82. 删除排序链表中的重复元素 II (每日一题 20210908)
存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字.返回同样按升序排列的结果链表.示例 1:输入:head = ...
- LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ
新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...
- 80. 删除有序数组中的重复项 II
80. 删除有序数组中的重复项 II Ideas 没啥技术含量,从后往前,check+delete. Code Python class Solution:def removeDuplicates(s ...
- 80. 删除排序数组中的重复项 II golang
80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...
- go数组去除重复_让我们一起啃算法----删除排序链表中的重复元素
删除排序链表中的重复元素(Remove-Duplicates-From-Sorted-List) 题干: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1-> ...
最新文章
- 实战脚本写入注册表,完善WindowsServer自动化运维
- 禁止ping入自己的主机
- 可靠性不是测试出来的,是设计出来的!
- 使用七牛图片遇到的图片方向翻转问题
- postman跨域测试_安装使用Hoppscotch构建API请求访问与测试
- 信安教程第二版-第16章网络安全风险评估技术原理与应用
- 视频(avi)转换为图片(Python代码实现)
- Android 应用开发(12)---可绘制对象资源
- 爽到爆!阿里腾讯都在用的API管理神器,API文档、测试、Mock全搞定
- vSphere 7 With K8s系列07:客户端工具使用
- 第一:Python安装需要的第三方库时,命令行输入pip提示不是内部或外部命令
- 看图说说class文件结构(部分)
- Python入门--字符串的编码与解码
- python关键字参数顺序_位置参数和关键字参数的求值顺序
- TensorFlow 2.0源码编译步骤
- Windows 10一周年更新版本号将锁定为Build 14393
- php获取省市区区划代码,使用PHP解析行政区划代码
- python身份证号查询信息
- plm系统 服务器不存在,PLM服务器和客户端使用方式
- 在线计算机免费课程表,Simple课程表