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

算法题打卡力扣第26. 删除有序数组中的重复项(easy))

题目描述

在这里插入图片描述
在这里插入图片描述

解题思路

想到双指针,使用快慢指针

思路详解:
我们使用两个指针,一个“慢指针” i 和一个“快指针” j。
慢指针 i:它指向新数组(即去重后数组)的末尾。i 左边(包括i)的所有元素都是已经处理好的、不重复的元素。
快指针 j:它负责向前探索,遍历整个原始数组,寻找新的、不重复的元素。

具体步骤:

  • 初始化慢指针 i = 0。快指针 j 从 1 开始遍历数组。
  • 当 j 向前移动时,比较 nums[j] 和 nums[i] 的值。
  • 如果 nums[j] 不等于 nums[i]:
    这说明 nums[j] 是一个新的、不重复的元素。
    我们首先将慢指针 i 向前移动一位 (i++)。
    然后,将 nums[j] 的值赋给 nums[i],即 nums[i] = nums[j]。这样,新的唯一元素就被添加到了结果数组的末尾。
  • 如果 nums[j] 等于 nums[i]:
    这说明遇到了重复元素。
    我们什么都不做,只需要让快指针 j 继续向前移动 (j++),直到找到一个和 nums[i] 不同的元素。
  • 当快指针 j 遍历完整个数组后,i 指向的位置就是最后一个唯一元素的位置。那么,新数组的长度就是 i + 1

代码实现:

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

执行结果
在这里插入图片描述
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)

为什么这个方法可行?

因为原始数组是有序的。这个前提条件保证了所有重复的元素一定是相邻的。因此,当快指针 j 发现一个与 nums[i] 不同的元素时,这个元素一定是它所在数值区间的第一个,也是唯一一个需要被保留的。
这是一个效率非常高的解法,时间复杂度为 O(n)(因为每个元素最多被访问两次),空间复杂度为 O(1)(因为我们是在原地修改)。
g老师给的更好更标准的答案供大家参考~

int removeDuplicates(int* nums, int numsSize) {// 处理边界情况,如果数组为空,直接返回0if (numsSize == 0) {return 0;}// i 是慢指针,j 是快指针// i 指向新数组的最后一个有效元素的位置int i = 0; // 快指针 j 从第二个元素开始遍历整个数组for (int j = 1; j < numsSize; j++) {// 如果快指针指向的元素与慢指针指向的元素不同if (nums[j] != nums[i]) {// 慢指针向前移动一位i++;// 将新元素的值赋给慢指针的新位置nums[i] = nums[j];}// 如果相同,则快指针 j 继续前进,慢指针 i 保持不动}// 新数组的长度是慢指针的索引值加 1return i + 1;
}

ok,see you next time~

http://www.xdnf.cn/news/1323523.html

相关文章:

  • Linux 中断机制深度分析
  • 【轨物交流】轨物科技与华为鲲鹏生态深度合作 光伏清洁机器人解决方案获技术认证!
  • nuScence数据集
  • 特种行业许可证识别技术:通过图像处理、OCR和结构化提取,实现高效、准确的许可证核验与管理
  • Android Cutout(屏幕挖孔)详解
  • Python day48.
  • 【笔记ing】考试脑科学 脑科学中的高效记忆法
  • OCR库pytesseract安装保姆级教程
  • Zephyr下控制ESP32S3的GPIO口
  • 飞算JavaAI家庭记账系统:从收支记录到财务分析的全流程管理方案
  • 上下文切换及线程操作相关内容
  • 微信小程序通过uni.chooseLocation打开地图选择位置,相关设置及可能出现的问题
  • 开放最短路径优先协议
  • Python装饰器:从入门到精通
  • QNX 性能分析工具(hogs pidin tracelogger)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Less (CSS 预处理器)
  • 贪心算法(Greedy Algorithm)详解
  • html页面打水印效果
  • 跨平台RTSP播放器深度对比:开源方案与商业SDK的取舍之道
  • 无人机迫降模式技术要点解析
  • 【C语言16天强化训练】从基础入门到进阶:Day 2
  • 基于ssm jsp中学校园网站源码和答辩PPT论文
  • 深入解析StatefulSet与K8s服务管理
  • 解锁 JavaScript 高级技能:从基础到实战的进阶指南
  • 【案例】ECharts 环形图中心下移后,如何保持中间图片和文案居中
  • 20250818在荣品的PRO-RK3566开发板跑Buildroot的时候使用在线秒表https://tool.hiofd.com/stopwatch/
  • 决策树:机器学习中的强大工具
  • 机器学习(决策树)
  • VLN视觉语言导航(3)——神经网络的构建和优化 2.3