【数组】Leetcode 80. 删除有序数组中的重复项 II【中等】

embedded/2024/11/13 10:51:39/

删除有序数组中的重复项 II 其他算法导航栏

  • 给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。

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

示例 :

输入: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、由于数组是有序的,重复元素一定是连续的。我们可以使用双指针技巧来解决这个问题。
  • 2、一个指针用于遍历数组,另一个指针用于记录下一个符合要求的位置。
  • 3、遍历数组,当遇到不符合要求的元素时,将其移动到指定位置,并将指定位置后移一位。

Java实现

public class RemoveDuplicates2 {public int removeDuplicates(int[] nums) {if (nums.length <= 2) {return nums.length;}int j = 2;for (int i = 2; i < nums.length; i++) {if (nums[i] != nums[j - 1] || nums[i] != nums[j - 2]) {nums[j] = nums[i];j++;}}return j;}public static void main(String[] args) {RemoveDuplicates2 removeDuplicates = new RemoveDuplicates2();int[] nums1 = {1, 1, 1, 2, 2, 3};int result1 = removeDuplicates.removeDuplicates(nums1);System.out.println("Test Case 1:");System.out.println("Original Array: [1, 1, 1, 2, 2, 3]");System.out.println("New Length: " + result1); // Expected: 5System.out.println("New Array: " + Arrays.toString(Arrays.copyOfRange(nums1, 0, result1))); // Expected: [1, 1, 2, 2, 3]int[] nums2 = {0, 0, 1, 1, 1, 1, 2, 3, 3};int result2 = removeDuplicates.removeDuplicates(nums2);System.out.println("\nTest Case 2:");System.out.println("Original Array: [0, 0, 1, 1, 1, 1, 2, 3, 3]");System.out.println("New Length: " + result2); // Expected: 7System.out.println("New Array: " + Arrays.toString(Arrays.copyOfRange(nums2, 0, result2))); // Expected: [0, 0, 1, 1, 2, 3, 3]}
}

时间空间复杂度

  • 时间复杂度: 遍历一次数组,时间复杂度为 O(n),其中 n 是数组的长度。
  • 空间复杂度: 使用了常数级的额外空间,空间复杂度为 O(1)。

http://www.ppmy.cn/embedded/30164.html

相关文章

深入理解MySQL中的MVCC和Undo日志

在MySQL数据库管理系统中&#xff0c;多版本并发控制&#xff08;MVCC&#xff09;是一个核心功能&#xff0c;特别是对于使用InnoDB存储引擎的系统。MVCC允许数据库在提供高并发性的同时&#xff0c;保持事务的一致性。本文将详细介绍MVCC的工作原理&#xff0c;其与Undo日志的…

C语言----贪吃蛇(补充)

各位看官好&#xff0c;我想大家应该已经看过鄙人的上一篇博客贪吃蛇了吧。鄙人在上一篇博客中只是着重的写了贪吃蛇的实现代码&#xff0c;但是前期的一些知识还没有具体的介绍&#xff0c;比如确认光标位置&#xff0c;句柄等。那么我这一篇博客就来补充上一篇博客所留下来的…

定期删除服务器n天前日志

删除指定目录及子目录下n天前文件 find /nas/logs/* -maxdepth 3 -type d -ctime 6 | xargs rm -rvffind /nas/logs/: 在 /nas/logs/ 目录下查找所有文件和目录。 通配符表示匹配任意文件或目录名。-maxdepth 3: 设置 find 命令的最大搜索深度为 3。这意味着 find 命令将在 /n…

golang中数组array和切片slice的区别

go语言中最常用的数据结构 数组array 和 切片 slice的区别对比&#xff1a; 定义和初始化&#xff1a; 数组&#xff1a; [size]类型 切片&#xff1a; []类型 &#xff0c; 数组变量[low:high] var arr1 [3]string{"a", "b", "c"} //…

细说SVPWM原理及软件实现原理,关联PWM实现

细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现 文章目录 细说SVPWM原理及软件实现原理&#xff0c;关联PWM实现1. 前言2. 基础控制原理回顾2.1 FOC 原理回顾2.2 细说 SVPWM2.2.1 矢量扇区计算2.2.2 矢量作用时间计算 2.2.3 如何理解 U4 U6 2/3Udc?2.2.4 如何理解 U4m…

Stable Diffusion WebUI 中文提示词插件 sd-webui-prompt-all-in-one

本文收录于《AI绘画从入门到精通》专栏,订阅后可阅读专栏内所有文章,专栏总目录:点这里。 大家好,我是水滴~~ 今天为大家介绍 Stable Diffusion WebUI 的一款中文提示词插件 sd-webui-prompt-all-in-one,就像它的名字一样,该插件几乎涵盖了提示词相关的所有功能。 文章内…

使用unreal engine5.3.2创建c++第一人称游戏

UE5系列文章目录 文章目录 UE5系列文章目录前言一、NuGet 简介二、解决方法&#xff1a; 前言 为了使用unreal engine5.3.2创建c第一人称游戏&#xff0c;今天安装了Visual Studio 2022专业版。在ue5中创建c工程&#xff0c;结果编译器报错&#xff1a; 严重性 代码 说明 项目…

利用大语言模型(KIMI)构建控制信息模型

数字化的核心是数字化建模&#xff0c;为一个事物构建数字模型是一项十分复杂的工作。不同的应用场景&#xff0c;对事物的关注重点的不同的。例如&#xff0c;对于一个智能传感器而言&#xff0c;从商业的角度看&#xff0c;产品的信息模型中应该包括产品的类型&#xff0c;名…