Python实现力扣经典面试题——删除有序数组中的重复项 II

题目:删除有序数组中的重复项 II

在这里插入图片描述

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。你可以想象内部操作如下:// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
int len = removeDuplicates(nums);// 在函数里修改输入数组对于调用者是可见的。
// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。
for (int i = 0; i < len; i++) {print(nums[i]);
}示例 1:输入:nums = [1,1,1,2,2,3]
输出:5, nums = [1,1,2,2,3]
解释:函数应返回新长度 length = 5, 并且原数组的前五个元素被修改为 1, 1, 2, 2, 3。 不需要考虑数组中超出新长度后面的元素。
示例 2:输入:nums = [0,0,1,1,1,1,2,3,3]
输出:7, nums = [0,0,1,1,2,3,3]
解释:函数应返回新长度 length = 7, 并且原数组的前七个元素被修改为 0, 0, 1, 1, 2, 3, 3。不需要考虑数组中超出新长度后面的元素。提示:1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums 已按升序排列

分析

题目要求在原地修改数组,并且保证空间复杂度为 O ( 1 ) O(1) O(1),意味着我们不能使用额外的空间。这里可以采用双指针的思路,遍历数组并通过指针 j 实现原地修改数组,去除重复元素超过两次的部分。

具体来说,我们可以维护两个指针 i 和 j,其中 i 表示当前遍历到的元素,而 j-2 表示上一个保留的元素(因为最多只保留两个重复元素)。如果 nums[i] == nums[j-2],则说明重复元素出现次数超过了两次,应该将其删除;否则说明该元素可以被保留,将其放入 j 的位置,并将 j 后移一位。
最后,返回指针 j 的值即可。

代码实现:
题目要求在原地修改数组,并且保证空间复杂度为 O ( 1 ) O(1) O(1),意味着我们不能使用额外的空间。这里可以采用双指针的思路,遍历数组并通过指针 j 实现原地修改数组,去除重复元素超过两次的部分。

具体来说,我们可以维护两个指针 ij,其中 i 表示当前遍历到的元素,而 j-2 表示上一个保留的元素(因为最多只保留两个重复元素)。如果 nums[i] == nums[j-2],则说明重复元素出现次数超过了两次,应该将其删除;否则说明该元素可以被保留,将其放入 j 的位置,并将 j 后移一位。

最后,返回指针 j 的值即可。

下面是解决该问题的 Python 代码实现:

def removeDuplicates(nums):if len(nums) <= 2:return len(nums)j = 2for i in range(2, len(nums)):if nums[i] != nums[j-2]:nums[j] = nums[i]j += 1return j# 示例测试
nums1 = [1, 1, 1, 2, 2, 3]
length1 = removeDuplicates(nums1)
print(length1, nums1[:length1])nums2 = [0, 0, 1, 1, 1, 1, 2, 3, 3]
length2 = removeDuplicates(nums2)
print(length2, nums2[:length2])

输出:

5 [1, 1, 2, 2, 3]
7 [0, 0, 1, 1, 2, 3, 3]

这段代码中的 removeDuplicates 函数实现了在原地修改数组,删除重复出现的元素,使得出现次数超过两次的元素只保留两次的要求。其中,j 表示当前数组可以被保留的最后一个元素的下一个位置。

该算法时间复杂度为 O ( N ) O(N) O(N),其中 N N N 是数组的长度。空间复杂度为 O ( 1 ) O(1) O(1),只需要常数空间来存储若干变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/492316.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2627. 函数防抖

说在前面 &#x1f388;不知道大家对于算法的学习是一个怎样的心态呢&#xff1f;为了面试还是因为兴趣&#xff1f;不管是出于什么原因&#xff0c;算法学习需要持续保持。 题目描述 请你编写一个函数&#xff0c;接收参数为另一个函数和一个以毫秒为单位的时间 t &#xff0…

【C++精简版回顾】10.this

1.定义 在 C 中&#xff0c;每一个对象都能通过 this 指针来访问自己的地址&#xff08;指向本身&#xff09;。this 指针是所有成员函数的隐含参数。因此&#xff0c;在成员函数内部&#xff0c;它可以用来指向调用对象。 2.this作用域是在类内部&#xff0c;只能在成员…

《Docker 简易速速上手小册》第7章 高级容器管理(2024 最新版)

文章目录 7.1 容器监控与日志7.1.1 重点基础知识7.1.2 重点案例&#xff1a;监控 Flask 应用7.1.3 拓展案例 1&#xff1a;使用 ELK Stack 收集和分析日志7.1.4 拓展案例 2&#xff1a;使用集成监控工具 7.2 性能调优与资源限制7.2.1 重点基础知识7.2.2 重点案例&#xff1a;Fl…

项目实战:Qt监测操作系统cpu温度v1.1.0(支持windows、linux、国产麒麟系统)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/136277231 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

随机分布模型

目录 前言 一、离散型随机变量 1.1 0-1分布 1.2 二项分布 1.3 帕斯卡分布 1.4 几何分布 1.5 超几何分布 1.6 泊松分布 二、连续型随机变量 2.1 均匀分布 2.2 指数分布 2.3 高斯分布/正态分布 2.4 分布&#xff08;抽样分布&#xff09; 2.5 t分布&#xff08;抽样…

NotePad2轻便够用的文本编辑器

下载方式&#xff1a; 360软件管家里就可以安装&#xff0c;非常的方便。 打开后&#xff0c;界面如下&#xff1a; 可以拖拽打开文本&#xff0c;和notepad的功能差不多&#xff0c;可以平行替代。

【力扣白嫖日记】178.分数排名

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 178.分数排名 表&#xff1a;Scores 列名类型idintscoredecimal 在 SQL 中&#xff0c;id 是该表的主键。 …

linux查看服务器内核CUP版本相关命令

服务器参考 计算架构&#xff1a;x86-64产品系列&#xff1a;华为云耀云服务器操作系列&#xff1a;CentOS 7 执行uname -a查看服务器内核版本 Linux hecs-82210 3.10.0-1160.92.1.el7.x86_64 #1 SMP Tue Jun 20 11:48:01 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux执行hostn…

LeetCode 1038.从二叉搜索树到更大和树

给定一个二叉搜索树 root (BST)&#xff0c;请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下&#xff0c; 二叉搜索树 满足下列约束条件&#xff1a; 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左…

【力扣 - 有效的括号】

题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同…

如何在 Shopify 中配置产品比较以获得最佳性能

引言 在竞争激烈的电子商务世界中&#xff0c;为在线零售商提供良好的购物体验至关重要。为了增强用户体验并帮助客户做出明智的购买决策&#xff0c;一种方法是提供产品比较功能。Shopify作为领先的电子商务平台&#xff0c;提供了各种工具和功能来以优秀方式配置产品比较。在…

docker 容器访问 GPU 资源使用指南

概述 nvidia-docker 和 nvidia-container-runtime 是用于在 NVIDIA GPU 上运行 Docker 容器的两个相关工具。它们的作用是提供 Docker 容器与 GPU 加速硬件的集成支持&#xff0c;使容器中的应用程序能够充分利用 GPU 资源。 nvidia-docker 为了提高 Nvidia GPU 在 docker 中的…