当前位置:网站首页>leetcode:80. 删除有序数组中的重复项 II
leetcode:80. 删除有序数组中的重复项 II
2022-08-01 14:36:00 【OceanStar的学习笔记】
题目来源
题目描述
题目解析
这道题是leetcode:26. 删除排序数组中的重复项的扩展
思路一
为了让解法更具有一般性,我们将原问题的「保留 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
class Solution {
public:
int work(vector<int>& nums, int k) {
int len = 0;
for(auto num : nums)
if(len < k || nums[len-k] != num)
nums[len++] = num;
return len;
}
int removeDuplicates(vector<int>& nums) {
return work(nums, 2);
}
};
思路二
利用快排双色分区partition思想,O(N),O(1)
维护两个指针,将数组分成三个区:
- [0 … validRange]为有效区(全是有效数)
- (validRange … curIndex)为垃圾区(全是垃圾数)
- [curIndex …]为未知区(还没看的数)
同时记录前一个数preNum和当前数出现次数count,遍历每个数,判断是否垃圾:
- 当前数首次出现,有效数,发货到有效区,同时扩充有效区;
- 当前数出现次数<2,有效数,发货到有效区,同时扩充有效区;
- 当前数出现次数已经>=2,垃圾数,扩充垃圾区;
最后返回有效区的长度即可(validRange+1)
class Solution {
public:
int removeDuplicates(vector<int>& arr) {
int n = arr.size();
if(n <= 2){
return n;
}
// [0 ... validRange]为有效区,(validRange ... curIndex)为垃圾区,[curIndex ...]为未知区
int validRange = 0, curIndex = 1; // 有效区右边界,当前处理位置
int preNum = arr[0], count = 1; // 前一个数,出现次数
while (curIndex < n) {
int curNum = arr[curIndex];
if (curNum != preNum) {
// 当前数首次出现,有效数
arr[++validRange] = arr[curIndex++]; // 发货到有效区,扩充有效区
preNum = curNum; // 记录该数
count = 1;
} else if (count < 2) {
// 当前数出现次数<2,有效数,发货到有效区,扩充有效区
arr[++validRange] = arr[curIndex++]; // 发货到有效区,扩充有效区
count++;
} else {
// 当前数出现次数已经>=2,垃圾数
curIndex++; // 扩充垃圾区
}
}
return validRange + 1;
}
};
边栏推荐
- 我寻找的方向
- 龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权
- openEuler 社区完成首批顾问专家聘用,共同为社区的发展贡献力量
- 微服务系统架构的演变
- 性能优化——粒子优化笔记
- 使用ffmpeg来查看视频的信息,fps,和width,height
- MBI5020 LED Driver
- The problem that the column becomes indexed after pd groupby and the aggregation column has no column name
- 反序列化漏洞详解
- [LiteratureReview]Optimal and Robust Category-level Perception: Object Pose and Shape Estimation f
猜你喜欢
通胀持续 肯尼亚粮食安全引关注
Koreographer Professional Edition丨一款Unity音游插件教程
直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践
免费使用高性能的GPU和TPU—谷歌Colab使用教程
预防和制止家庭暴力 人身安全保护令司法解释今起施行
Wovent Bio IPO: Annual revenue of 480 million pension fund is a shareholder
股票策略02 | 技术择时+行业因子+市值轮动
openEuler 社区完成首批顾问专家聘用,共同为社区的发展贡献力量
性能测试入门指南
Chat technology in live broadcast system (8): Architecture practice of IM message module in vivo live broadcast system
随机推荐
Bloom filter bloom
mysql查询两个字段值相同的记录
牛客刷SQL--7
[Binary Tree] Path Sum II
热心肠:关于肠道菌群和益生菌的10个观点
MySQL中的时区设置
JSON数据转换总结(VIP典藏版)
Typora报错:This beta version of Typora is expired
ABC260 E - At Least One(双指针)
openEuler 社区完成首批顾问专家聘用,共同为社区的发展贡献力量
HTB-Mirai
对标丰田!蔚来又一新品牌披露:产品价格低于20万
SSM入门
kubernetes之DaemonSet以及滚动更新
2022年5月20日最全摸鱼游戏导航
1161. 最大层内元素和
Could not write header for output file #0 (incorrect codec parameters ?): ……
D - I Hate Non-integer Number(背包dp)
CSDN配置功能总结
灵魂发问:MySQL是如何解决幻读的?