删除排序数组中的重复项Ⅱ(C,Python)

  • 1. 题目描述
  • 2. 题目分析
  • 3. C语言实现
  • 4. Python实现

1. 题目描述

难度:中等

2. 题目分析

这道题是LeetCode–26. 删除排序数组中的重复项的进阶版,不过处理思路是一样的。根据题目,需要注意一下四点:

  • 给定的输入数组是已经排好序的
  • 需要在原地删除重复的元素,也就是说我们不可以在重新定义数组来存放结果,需要对原数组进行修改
  • 返回的是修改之后数组的长度,而不是数组本身
  • 不需要考虑数组中超出新长度后面的元素,也就是说,我们可以将原数组的前一部分更新为我们想要的结果,然后返回这部分的长度即可,不需要考虑着部分之后的元素是否也符合要求。举个例子:
    a = [0,0,1,1,2,2,2,3] 修改之后的a=[0,1,2,3,2,2,3] 我们只需要返回长度为4的a即[0,1,2,3]这一部分就可以了。

有两种方法:

  • 暴力求解法(Python)
    所谓的暴力求解法就是依次遍历数组,如果该元素与相邻元素重复并且超过了2个,那么就将相邻的这个元素删除,如第4节所示。时间复杂度为O(n^2).
  • 双指针法(C)
    我们可以放置两个指针 i和 j,其中 i 是慢指针,而 j 是快指针。只要 nums[i] = nums[j],我们就增加 j 以跳过重复项。
    当我们遇到 nums[j] != nums[i]并且重复次数超过2次时,跳过重复项的运行已经结束,因此我们必须把它(nums[j])的值复制到 nums[i + 1]。然后递增 i,接着我们将再次重复相同的过程,直到 j 到达数组的末尾为止。如第3节所示, 时间复杂度为O(n)。

3. C语言实现

代码如下:

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

运行结果为:

4. Python实现

代码如下:

class Solution:def removeDuplicates(self, nums: List[int]) -> int:i = 0flag = 1if len(nums) < 2: return len(nums)while(i != len(nums)-1):if nums[i] == nums[i+1]:if flag == 1:flag = 2i += 1else:del nums[i+1]else: i += 1flag = 1return len(nums)

运行结果为:

LeetCode--80. 删除排序数组中的重复项Ⅱ(双指针,暴力)相关推荐

  1. LeetCode 80. 删除排序数组中的重复项 II

    1. 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完 ...

  2. Leecode刷题【1数组专题4】80. 删除排序数组中的重复项II (以及通用解法)

    Leecode刷题 [1数组专题4]80. 删除排序数组中的重复项II (以及通用解法) 题目: 思路 双指针法: (错误代码) 正解: 通用解法: 题目: 给你一个有序数组 nums ,请你 原地 ...

  3. 80. 删除排序数组中的重复项 II golang

    80. 删除排序数组中的重复项 II 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O ...

  4. C++描述 LeetCode 26. 删除排序数组中的重复项

    C++描述 LeetCode 26. 删除排序数组中的重复项   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在CSDN中写博客 ...

  5. LeetCode 79单词搜索80删除排序数组中的重复项Ⅱ81.搜索旋转排序数组Ⅱ

    新人公众号(求支持):bigsai 专注于Java.数据结构与算法,一起进大厂不迷路! 算法文章题解全部收录在github仓库bigsai-algorithm,求star! 关注回复进群即可加入力扣打 ...

  6. leetcode 26 删除排序数组中的重复项

    https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素 ...

  7. LeetCode 26. 删除排序数组中的重复项

    1. 题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成 ...

  8. LeetCode(#26)————删除排序数组中的重复项

    题目 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 示 ...

  9. 索引超出了数组界限_【每天一题】LeetCode 26. 删除排序数组中的重复项

    开源地址 JiauZhang/algorithms​github.com 题目描述 * https://leetcode-cn.com/problems/remove-duplicates-from- ...

  10. 14. Leetcode 80. 删除有序数组中的重复项 II (数组-同向双指针-快慢指针)

    给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 最多出现两次 ,返回删除后数组的新长度.不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条 ...

最新文章

  1. fiddler4 使用教程
  2. 可以预防新冠病毒的项链 -脉动
  3. 科普:算法岗是什么?我适不适合算法岗?选什么方向的算法岗?
  4. jdbc的预处理中如何处理模糊查询
  5. 用计算机求正有理数算术平方根的步骤,用计算器求算数平方根、用有理数估计算数平方根的大小.ppt...
  6. linux怎么运行g77,Linux安装g77编译器的技巧
  7. WSP (无线会话协议)
  8. C#LeetCode刷题,走进Google,走近人生
  9. 微软发布新版Silverlight 5 - 版本 5.1.10411.0
  10. Update Remote Files 1.0
  11. access mysql odbc驱动程序_access odbc驱动下载|
  12. android反编译工具推荐,Android 反编译工具的各种用法
  13. 3款堪称神器的电脑软件,简单又实用
  14. 苏宁大数据怎么运营_苏宁首个无人店大数据曝光,其消费人群是如何分布的?...
  15. 计算机是概念化不是程序化,走进计算思维
  16. 数据中台和数仓的关系
  17. 零基础学习Hadoop
  18. 高数——定积分计算大法之换元法
  19. linux下安装以太坊(ETH/ETC)节点
  20. 自媒体新人常见问题汇总-千氪

热门文章

  1. Redis的N种妙用,不仅仅是缓存
  2. 电平通讯速度_RS-485总线电平异常解决方案解析
  3. 爬虫-通过正则表达式爬取学校选课网站的课程
  4. javascript脚本语言_10分钟快速掌握Javascript核心特性
  5. linux 数据库 超出,[QAD]数据库超过2G,备份出现问题(linux)
  6. php中file对象实例,AJAX_File, FileReader 和 Ajax 文件上传实例分析(php),File FileReader 可以干什么? Ajax - phpStudy...
  7. 有了商城源码如何部署到本地服务器_怎么将本地做好的网站部署到服务器上?...
  8. cv_bridge 调用ros自带的opencv版本的解决
  9. 转载:GBDT算法梳理
  10. 那些查了无数遍的问题