26.删除排序数组中的重复项(力扣LeetCode)

news/2024/6/18 21:47:00 标签: leetcode, 算法, 数据结构, c++, 双指针

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

题目描述

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

考虑 nums 的唯一元素的数量为 k ,你需要做以下事情确保你的题解可以被通过:

  • 更改数组 nums ,使 nums 的前 k 个元素包含唯一元素,并按照它们最初在 nums 中出现的顺序排列。nums 的其余元素与 nums 的大小不重要。
  • 返回 k 。

判题标准:

系统会用下面的代码来测试你的题解:

int[] nums = [...]; // 输入数组
int[] expectedNums = [...]; // 长度正确的期望答案

int k = removeDuplicates(nums); // 调用

assert k == expectedNums.length;
for (int i = 0; i < k; i++) {
    assert nums[i] == expectedNums[i];
}

如果所有断言都通过,那么您的题解将被 通过。

示例 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 。不需要考虑数组中超出新长度后面的元素。

提示:

  • 1 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按 非严格递增 排列

双指针

// 定义解决问题的类 Solution
class Solution {
public:
    // 函数用来删除排序数组中的重复项,并返回新数组的长度
    int removeDuplicates(vector<int>& nums) {
        // 如果数组为空,则没有任何操作需要被执行
        if (nums.size() == 0) return 0;
        
        // 初始化慢指针 slow 为 1,因为至少第一个元素不需要对比就可以确定保留
        int slow = 1;
        
        // 开始从数组的第二个元素遍历,快指针 fast 代表当前遍历到的元素
        for (int fast = 1; fast < nums.size(); fast++) {
            // 当快指针指向的元素与前一个元素不同时,说明遇到了一个新的元素
            if (nums[fast] != nums[fast - 1]) {
                // 将快指针指向的新元素复制到慢指针的位置
                nums[slow] = nums[fast];
                // 慢指针向前移动一位,为下一个可能的唯一元素留位置
                slow++;
            }
            // 如果快指针指向的元素与前一个元素相同,快指针继续向前移动,直到找到新的元素
            // 慢指针保持不动,等待下一个唯一元素的到来
        }
        // 由于慢指针始终指向新数组的末尾,所以它也代表了数组中不同元素的个数
        return slow;
    }
};

暴力

class Solution {
public:
    // 函数removeDuplicates用于删除排序数组中的重复项
    int removeDuplicates(vector<int>& nums) {
        // 获取数组的长度
        int size = nums.size();
        
        // 从数组的第二个元素开始遍历,因为我们要和前一个元素比较
        for (int i = 1; i < size; i++) {
            // 若当前元素和前一个元素相同,则需要删除当前元素
            if (nums[i] == nums[i - 1]) {
                // 将当前元素之后的所有元素向前移动一位
                // 这是删除元素的操作
                for (int j = i; j < size - 1; j++) {
                    nums[j] = nums[j + 1];
                }
                // 数组大小减1,因为删除了一个元素
                size--;
                // 索引i后退一步,因为下一个元素已经移动到当前位置
                // 我们需要在下一次循环中重新检查这个新移过来的元素
                i--;
            }
        }
        // 返回处理后数组的新长度
        return size;
    }
};

http://www.niftyadmin.cn/n/5345657.html

相关文章

中移(苏州)软件技术有限公司面试问题与解答(4)—— virtio所创建的设备1

接前一篇文章&#xff1a;中移&#xff08;苏州&#xff09;软件技术有限公司面试问题与解答&#xff08;0&#xff09;—— 面试感悟与问题记录 本文参考以下文章&#xff1a; VirtIO实现原理——PCI基础 VirtIO实现原理——virtblk设备初始化 特此致谢&#xff01; 本文对…

【Linux】进程间通信——信号量

让大家久等啦&#xff0c;本期我们来讲讲Linux系统中的信号量 目录 一、引入 二、认识信号量 2.1 信号量的概念 2.2 信号量的内核结构 三、关于信号量的接口 3.1 semget 3.2 ipcs -s 3.3 ipcrm -s 3.4 semctl 3.5 semop 四、理解IPC 一、引入 在开始之前我们先来认…

【RabbitMQ】延迟队列之死信交换机

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《RabbitMQ实战》。&#x1f3af;&#x1f3af; &am…

一例仙女座僵尸网络样本分析

这是一个Gamarue&#xff08;又叫Andromeda僵尸网络或仙女座&#xff09;样本&#xff0c;通过可移动存储介质传播&#xff0c;这个样本的运行过程比较复杂&#xff0c;分为多个阶段&#xff0c;几乎所有的重要操作都是在内存中通过shellcode来完成的&#xff0c;分析起来比较麻…

springboot(ssmit职业生涯规划系统 职业规划学习系统Java系统

springboot(ssmit职业生涯规划系统 职业规划学习系统Java系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7…

EasyCVR视频融合平台雪亮工程视频智能监控方案设计与应用

随着科技的不断发展&#xff0c;视频监控已经成为城市安全防范的重要手段之一。为了提高城市安全防范水平&#xff0c;各地纷纷开展“雪亮工程”&#xff0c;即利用视频智能监控技术&#xff0c;实现对城市各个角落的全方位、全天候监控。本文将介绍一种雪亮工程视频智能监控方…

[AIGC 大数据基础] 浅谈hdfs

HDFS介绍 什么是HDFS&#xff1f; HDFS&#xff08;Hadoop Distributed File System&#xff09;是Apache Hadoop生态系统的一部分&#xff0c;是一个分布式文件系统。它被设计用于存储和处理大规模数据集&#xff0c;并且能够容错、高可靠和高性能地处理文件。 HDFS是为了支…

❤ javascript时间戳操作全系列(不断更新中...)

❤ javascript时间戳操作全系列&#xff08;不断更新中…&#xff09; JavaScript时间戳 1. 认识时间格式 Date类型 &#xff1a; Fri Jul 21 2023 14:21:59 GMT0800 (中国标准时间) 时间字符串&#xff1a; 2021-02-13 13位时间戳&#xff1a; 1676246400000 2. 时间相关函数…