当前位置: 首页 > news >正文

力扣80、删除有序数组中的重复项Ⅱ(中等)

1 题目描述

图1 题目描述

2 题目解读

        对于有序数组nums,要求在不使用额外数组空间的条件下,删除数组nums中重复出现的元素,使得nums中出现次数超过两次的元素只出现两次。返回删除后数组的新长度。

3 解法一:双指针

        双指针法可以很好地解决此题。

3.1 解题思路

        设置双指针,从数组nums的第3个元素开始比较,直到nums的最后一个元素。

3.2 设计代码

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) {return n;}int slow = 2, fast = 2;while (fast < n) {if (nums[slow - 2] != nums[fast]) {nums[slow] = nums[fast];++slow;}++fast;}return slow;}
};
int main() {int x[] = { 1,1,1,2,2,3 };vector<int> nums;for (int i = 0; i < 6; i++){nums.push_back(x[i]);}Solution S;int ans = S.removeDuplicates(nums);cout << ans << endl;return 0;
}

3.3 复杂度分析

  • 时间复杂度:O(n)。while循环遍历了一遍数组元素。
  • 空间复杂度:O(1)。没有使用额外数组空间。

3.4 提交结果

图2 双指针法代码执行结果

4 解法二:前移法

        前移法是由双指针法扩展出来的一种方法,与双指针法有着相似的思想。

4.1 解题思路

        设置指针right,从数组nums的第3个元素开始遍历,使用变量k记录需要移除的元素的个数,将需要移动的元素前移k个位置。

4.2 设计代码

#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:int removeDuplicates(vector<int>& nums) {int n = nums.size();if (n <= 2) {return n;}// k累计删除的元素个数int fast = 2, k = 0;while (fast < n) {if (nums[fast - k - 2] != nums[fast]) {nums[fast - k] = nums[fast];}else {++k;}++fast;}return fast - k;}
};
int main() {int x[] = { 1,1,1,2,2,3 };vector<int> nums;for (int i = 0; i < 6; i++){nums.push_back(x[i]);}Solution S;int ans = S.removeDuplicates(nums);cout << ans << endl;return 0;
}

4.3 复杂度分析

  • 时间复杂度:O(n)。while循环遍历了一遍数组nums的元素。
  • 空间复杂度:O(1)。没有使用额外数组空间。

4.4 提交结果

图3 前移法代码执行结果

5 解题心得

  • 让有序数组nums中重复出现的元素只出现两次,是让其只出现一次的变体题目,难度更大。
  • 双指针法与前移法之间,可以相互转换。
  • 双指针法中,left指针用于放置新元素。
http://www.lryc.cn/news/288124.html

相关文章:

  • 探索HTMLx:强大的HTML工具
  • NC65中间件能启动,前端客户端启动失败,加载异常,卡住(org.owasp.esapi)
  • 【大数据】YARN调度器及调度策略
  • 如何快速入门Python指南
  • vue3 页面长时间不使用,再次点击页面切换路由 操作无效报错
  • 【算法练习】leetcode算法题合集之动态规划篇
  • 青少年人工智能实验基地解决方案
  • 10个让你的明星网红推广事半功倍的技巧-华媒舍
  • k8s集群异常恢复
  • NOC总线(2)
  • 2401llvm,clang的libtooling
  • 数据结构—基础知识(13):树的存储结构
  • 【Python爬虫入门到精通】小白也能看懂的知识要点与学习路线
  • 服务器数据恢复—EVA存储raid5硬盘离线的数据恢复案例
  • MAMBA论文疑被拒收,计算机科学顶会评审遭质疑
  • EHS管理系统为何需要物联网的加持?
  • 记事本(父页面与iframe子页面的联通,vue3+ts展示fbx模型,与tga贴图)
  • 【好书推荐-第五期】《互联网大厂推荐算法实战》(异步图书出品)
  • C++ Qt day2
  • Mac上如何设置映射某个网站站点域名的IP
  • 智能分析网关V4智慧冶金工厂视频智能监管方案
  • WebSocket实现HTML+SpringBoot聊天功能,小程序+SpringBoot聊天功能
  • SpringMVC-RESTFul
  • Spring Boot3整合knife4j(swagger3)
  • 解决Windows系统本地端口被占用
  • GPS位置虚拟软件 AnyGo mac激活版
  • 视频号视频怎么使用视频号下载助手提取视频呢?
  • 第一篇【传奇开心果短博文系列】鸿蒙开发技术点案例示例:从helloworld开始理解鸿蒙开发ArkTS编程思路
  • 四、MySQL之DML DQL
  • YOLOv8优化策略:注意力涨点系列篇 | 多尺度双视觉Dualattention | Dual-ViT,顶刊TPAMI 2023