Leecode 26. 删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。

由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。

将最终结果插入 nums 的前 k 个位置后返回 k 。

不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

示例 1:

输入:nums = [1,1,2]
输出:2, nums = [1,2,_]
解释:函数应该返回新的长度 2 ,并且原数组 nums的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

示例 2:

输入:nums = [0,0,1,1,1,2,2,3,3,4]
输出:5, nums = [0,1,2,3,4]
解释:函数应该返回新的长度5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 升序 排列

题目链接

点我跳转题目

解题思路

双指针解法
数组中删除元素即为将有效元素覆盖无效元素。
因为数组有序且存在重复元素,所以重复元素在数组中一定相邻,使用快慢指针。
算法流程:
比较两指针指向的元素是否相同
若nums[fast] == nums[slow],则继续移动快指针,直到找到有效元素。
若nums[fast] != nums[slow],则将fast位置上的有效元素覆盖到slow后一位,然后更新慢指针位置,继续指向有效元素的最后一位。
最终返回slow + 1,即为有效元素的数量。

算法代码

    public int removeDuplicates(int[] nums) {int slow = 0,fast = 1;if (nums.length == 0 && nums == null){return -1;}for (;fast < nums.length;fast++){if (nums[fast] != nums[slow]){nums[++slow] = nums[fast];   }}return ++slow;}
  • 时间复杂度:O(N)
  • 空间复杂度:O(1)

Bia布刷题日记2022/2/17相关推荐

  1. Bia布刷题日记 2022/2/16

    Leecode34. 在排序数组中查找元素的第一个和最后一个位置 给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 如果数组中不存在目 ...

  2. Bia布刷题日记2022/2/15

    Leecode35.搜索插入位置 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 请必须使用时间复杂度为 O(log n) 的 ...

  3. Bia布刷题日记 LC-1

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那两个整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中 ...

  4. Bia布刷题日记 LC-15 三数之和

    Leecode 540 有序数组中的单一元素 算法描述: 540.有序数组中的单一元素给你一个仅由整数组成的有序数组,其中每个元素都会出现两次,唯有一个数只会出现一次. 请你找出并返回只出现一次的那个 ...

  5. 一个算法笨蛋的12月leetCode刷题日记

    类似文章 一个算法笨蛋的2021年11月leetCode刷题日记 一个算法笨蛋的2021年12月leetCode刷题日记 一个算法笨蛋的2022年1月leetCode刷题日记 一个算法笨蛋的2022年 ...

  6. 菜菜的刷题日记 | 66.加一 Plus One

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/7 文章目录 [题目] [我的代码] [参考代码1] [参考代码2] [参考代码3] [思 ...

  7. 菜菜的刷题日记 | 12.整数转罗马数字

    系列索引:菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子 菜鸡的刷题之路--2022/1/24,这几天忙着肝并发编程,题在做但是没空写题解,今晚补一篇. 文章目录 [题目] [官方 ...

  8. Leetcode刷题日记:21-25题篇

    Leetcode刷题日记:21-25题篇 简介 题目: 21. 合并两个有序链表 22. 括号生成 23. 合并K个升序链表 24. 两两交换链表中的节点 25. K 个一组翻转链表 注 简介 这个系 ...

  9. 牛客刷题日记(2021-12-8)

    牛客刷题日记(2021-12-8) 题目: 以下哪个接口的定义是正确的?( )interface B { void print() { } ;}interface B { static void pr ...

最新文章

  1. Android性能优化之启动优化实战篇,最新整理
  2. VC++ _T()宏学习
  3. spring boot第二讲
  4. 20155327第三周学习总结
  5. [数分提高]2014-2015-2第9教学周第1次课 (2015-04-28)
  6. 修改oracle内存大小
  7. asp类型转换函数汇总 转贴
  8. 分析JQ作者的类实现过程
  9. 微波射频学习笔记2--------传输线理论
  10. android 取消选中状态,Android:显示/隐藏偏好检查/取消选中其他CheckBoxPreference
  11. 给IT新人的15点建议:苦逼程序员的辛酸反省与总结
  12. php 数字转大写人民币
  13. 尘锋信息scrm与企鲸客的功能差别
  14. LTspice基础教程-010.波形查看器的使用
  15. Occlusion culling
  16. MFC 右键菜单呼出
  17. Java工程师资格证书
  18. 蒙特卡洛法求概率密度函数matlab,matlab的蒙特卡洛算法-----用概率算法求pi值
  19. office visio project安装
  20. python模拟生成真实的电话号码 / 姓名

热门文章

  1. access violation at address 异常
  2. 最好用的ftp客户端:SecureFX for Mac
  3. 有什么好用的苹果群控软件?
  4. Linux——磁盘分区与挂载
  5. 浅谈商城站点如何创造价值
  6. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
  7. 山楂整形修剪的技术方法
  8. [Android][设置最小(大)宽高]
  9. Fabric的Raft共识机制
  10. RC6加密解密算法C#实现源码!