当前位置:网站首页>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;
}
};
边栏推荐
猜你喜欢

String comparison size in MySQL (date string comparison problem)

直播系统聊天技术(八):vivo直播系统中IM消息模块的架构实践

易优压双驱挖掘机压路机器类网站源码 v1.5.8

微信UI在线聊天源码 聊天系统PHP采用 PHP 编写的聊天软件,简直就是一个完整的迷你版微信

Amperon IPO meeting: annual revenue of 500 million Tongchuang Weiye and China Mobile Innovation are shareholders

魔众文档管理系统 v5.0.0

只知道SQL数据库?又一国产数据库语言诞生了
![[Binary Tree] Path Sum II](/img/ed/741b213f620f19975bdb479de015b1.png)
[Binary Tree] Path Sum II

【无标题】

SQL查询数据以及排序
随机推荐
轮询和长轮询的区别
牛客刷SQL--3
opencv 保存图片imwrite
微服务系统架构的演变
MySQL中根据日期进行范围查询
A Beginner's Guide to Performance Testing
什么是闭包?
可观测性就是对“监控”的包装?
使用open3d可视化3d人脸
沃文特生物IPO过会:年营收4.8亿 养老基金是股东
[Binary Tree] Path Sum II
Gradle series - Gradle tests, Gradle life cycle, settings.gradle description, Gradle tasks (based on Groovy documentation 4.0.4) day2-3
倪光南:openEuler已达国际同类社区水准
又拿三个大奖?!多力就是要让你吃的更营养更健康
分布式中的CAP原理
Pytorch —— 分布式模型训练
HTB-Mirai
what is tail tooth feast
Pytorch - Distributed Model Training
Could not write header for output file #0 (incorrect codec parameters ?): ……