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

【算法-数组-python】删除有序数组中的重复项 💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。非常期待和您一起在这个小小的网络世界里共同探索、学习和成长。💝💝💝 ✨✨ 欢迎订阅本专栏 ✨✨。 阅读详情

一、题目

题目描述

给你一个 非严格递增排列 的数组 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 已按 非严格递增 排列

一、代码与思路

🧠C++语言思路

1、双指针法:使用快慢双指针遍历数组。慢指针始终指向已处理区域的最后一个唯一元素。
2、快指针作用:寻找下一个与慢指针不同的元素。
3、赋值操作:当发现新元素时,将慢指针后移一位,并将新元素值赋给该位置。
4、终止条件:快指针完成数组遍历后,慢指针位置+1即为唯一元素个数。

时间复杂度:O(n)
空间复杂度:O(1)

✅C++代码

#include <iostream>
#include <vector>
#include <cassert>

using std::cin;
using std::cout;
using std::vector;

extern "C" {
    int removeDuplicates(int* nums, int numsSize) {
        // 处理边界情况
        if (numsSize == 0)
        {
            return 0; // 数组为空,无需删除
        }

        // 慢指针表示唯一元素的最后一个位置
        int slow = 0;
        // 快指针表示下一个待处理元素的位置
        int fast = 1;

        for (; fast < numsSize; ++fast)
        {
            // 发现新元素时更新慢指针并赋值
            if (nums[fast] != nums[slow])
            {
                slow++;
                nums[slow] = nums[fast]; // 更新慢指针位置的值
            }
        }

        /*
        while (fast < numsSize)
        {
            // 发现新元素时更新慢指针并赋值
            if (nums[fast] != nums[slow])
            {
                slow++;
                nums[slow] = nums[fast]; // 更新慢指针位置的值
            }
            fast++; // 快指针后移
        
        */

        // 数组中唯一元素的个数
        return slow + 1;
    }
}


class Solution {
public:
    int removeDuplicates(vector<int>& nums) {
        int n = nums.size(); // 数组长度

        // 处理边界情况
        if (nums.empty()) return 0; // 数组为空,无需删除

        // 慢指针表示唯一元素的最后一个位置
        int slow = 0;
        // 快指针表示下一个待处理元素的位置
        int fast = 1;

        for (; fast < n; ++fast)
        {
            if (nums[fast] != nums[slow])
            {
                slow++; // 快指针后移
                nums[slow] = nums[fast]; // 更新慢指针位置的值
            }
        }
        // 数组中唯一元素的个数
        return slow + 1;
    }
};

// 单元测试
void testC()
{
    int nums[] = {1,1,2};
    int expectedNums[] = {1,2}; // 期望答案
    int numsSize = sizeof(nums) / sizeof(nums[0]);

    int k = removeDuplicates(nums, numsSize);

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

    cout << "Test C pass!" << "\n";
}

void testCpp()
{
    vector<int> nums = {0,0,1,1,1,2,2,3,3,4};
    vector<int> expectedNums = {0,1,2,3,4}; // 期望答案

    int k = Solution().removeDuplicates(nums);

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

    cout << "Test Cpp pass!" << "\n";
}
int main(void)
{
    testC();
    testCpp();
    return 0;
}
【简单】力扣算法题解析LeetCode26:删除有序数组中的重复项 要求原地删除非严格递增数组中的重复元素,并返回唯一元素的个数。使用双指针法(快慢指针)高效解决:慢指针slow标记唯一序列末尾,快指针fast遍历数组。当nums[fast]与nums[slow]不同时,将fast的值赋给slow+1位置。最终返回slow+1作为唯一元素数量。该算法时间复杂度O(n),空间复杂度O(1),满足原地修改要求。代码简洁高效,适用于有序数组去重场景。 阅读详情

相关推荐

【数据挖掘】心跳信号分类预测 之 特征工程 —— 学习笔记(三)

三、特征工程 3.1 看书 常言道,“巧妇难为无米之炊”。在 ML 中,数据和特征将作“米”,模型和算法则为“妇”。若无数量充足的数据、良好表示的特征,再强大的模型也难以得到满意的结果 (garbage in,garbage out)。对于 ML 问题,数据和特征往往决定了结果的上限,而模型、算法的选择及优化则是在逐步接近该上限。 特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。在本质上,特征工程是一个表示和展现数据的过程。在实际中,特征工程旨在去除...

闻韶 3358

leetcode:26. 删除有序数组中的重复项(python3解法)

leetcode:26. 删除有序数组中的重复项(python3解法)

qq_41905051的博客 411

基于Ollama本地大模型的Python自动化翻译工具开发实践

本文详细介绍了如何利用Ollama本地大模型和Python开发自动化批量翻译工具。通过部署本地开源模型、设计精准提示词、处理长文本分割及多种文档格式,构建了一个兼顾隐私安全、可控性与成本效益的翻译流水线,有效解决了文档批量翻译的痛点。

yhn45678901的博客 560

【学习记录】leetcode 26.删除有序数组中的重复项 python3

由于数组最后只剩下唯一元素,所以k也是数组的大小,在快慢指针法中slow的大小也是数组最后一个元素的下标,数组大小=slow+1,也就是说最后我们返回slow+1即可。接下来慢指针要指向我们要更新的元素的下标,因为我们要让每个元素仅出现一次,所以我们要更新的元素是当前slow指向的后一个元素(保留当前的slow元素)我们先前说过快指针的目的,是要找到与慢指针指向的元素不相同的元素,也即新数组的元素,那么这一句话可以写作if条件语句,就是。快指针:找到与慢指针指向的元素不相同的元素,也即新数组的元素。

2201_75871584的博客 547

前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)

今天学习了登录和注册页面的设计,主要是HTML和CSS部分,注册和切换采用了Js代码进行,后面将通过js进行填写内容的验证,进而可通过JSP跳转到Servlet进行DAO数据的校验,这属于后端部分了。 总体设计思路:整个页面设计可以分为主体(content)、头部(content-header)、内容(content-body)三个部分组成,其中是主体是根部,包含了头部和内容,头部和内容各自下设两...

weixin_43691879的博客 1万+

modbus

从机地址 功能码 起始地址高位 起始地址低位 数量高位 数量低位 字节数 0001H高位 0001H低位 0002H高位 0002H低位 CRC高位 CRC低位。每个输入寄存器的长度为2个字节。其中,CDH对应线圈0013H到001AH的内容,01H对应线圈001B到001CH的内容,未使用位用0填充。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。从机地址 功能码 起始地址高位 起始地址低位 寄存器数量高位 寄存器数量低位 CRC高位 CRC低位。

lunhuicnm的博客 9744

LeetCode(Python实现)—删除有序数组中的重复项

记录 LeetCode 刷题之路!

Ricce的博客 1318

Unity3d 编译发布到安卓平台时出现的问题集

环境搭建好了,android SDK也有了,但导出的时候提示Error building Player: Win32Exception: ApplicationName='java.exe'....... 国内好像没看到解决方法。在Unity3d的论坛里面看到一个解决方法,把C:\windows\system32\java.exe复制到C:\Windows\SysWOW64里面,我这里就解决

erictang01的专栏 1772

Java-删除有序数组中的重复项

给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:5, nums = [0,1,2,3,4]输出:2, nums = [1,2,_]输入:nums = [1,1,2]

weixin_60588588的博客 571

易灵思Ti60F100 FPGA的HyperRAM实战:从硬件连接到Native接口时序调试

本文详细介绍了易灵思Ti60F100 FPGA内置HyperRAM控制器的实战应用。文章从硬件设计要点(如400MHz+信号完整性、等长匹配)切入,重点解析了如何通过Interface Designer配置高效的Native接口,并分享了其时序详解与调试技巧,为开发者提供了一份从硬件连接到软件调试的深度指南。

weixin_29168153的博客 453

AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发

注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。

nihaoljq2010的博客 833

力扣LeetCode第26题 删除有序数组中的重复项

力扣LeetCOde第26题删除有序数组中的重复项

weixin_44061444的博客 2138

Linux ARM平台开发系列讲解(LED) 2.1.1 如何点亮一个LED之添加设备树信息

1. 设备树添加设备信息 我拿到的开发板上有两颗LED供用户编程使用,分别是GPIO5_IO8和GPIO5_IO9,设备信息如下,不同板子的设备定义不同,根据自己的实际情况进行添加。 2. 编译设备树 根据自己拿到的SDK,执行编译命令,我这里拿到的SDK编译脚本为: ./build.sh kernel 3. 使用uuu工具烧录新编译好的内核 因为imx8 SDK设备树和内核是统一编译成一个镜像,所以只需要烧录内核,设备树文件也会烧录。 sudo uuu -b emmc imx-kernel.bin

DSMGUOGUO的博客 917

[力扣LeetCode]26-删除有序数组中的重复项

[力扣LeetCode]26-删除有序数组中的重复项

JoeyTanHDU的博客 1593

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【LeetCode】力扣26.删除有序数组中的重复项(双指针)

定义一个fast指向第二个元素(下标为1)一个slow指向第一个元素(下标为0)。使用fast自加遍历数遇到和slow指针指向元素一样的:fast指针继续后移,不做多余操作;遇到和slow指针不一样的,slow指针向后移一位,并将slow写为fast的元素。fast继续向后移动一位最后slow的值+1就是新数组的长度(因为slow是下标,所以返回数组长度+1划重点!!!),直接返回。

m0_73726899的博客 611

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

leetcode力扣——27.移除元素、26.删除有序数组的重复项、80.删除有序数组中的重复项 II

本文总结了LeetCode上三道关于数组去重的题目解法。27题要求移除指定值元素,使用双指针法遍历数组,将非目标值前移。26题针对有序数组去重,保留单一元素,通过比较当前与前驱元素实现。80题在有序数组中允许元素最多出现两次,通过计数器控制保留次数。三题均采用双指针法实现原地修改,时间复杂度O(n),空间复杂度O(1)。核心思路都是通过维护一个指针来标记有效元素位置,根据不同条件筛选保留元素。

Xiaoyuan_he的博客 848

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

力扣(Leetcode)第26题:删除有序数组中的重复项(C语言版本)---双指针方法

给你一个 非严格递增排列 的数组 ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2。考虑 的唯一元素的数量为 ,你需要做以下事情确保你的题解可以被通过:numsk。输入:nums = [0,0,1,1,1,2,2,3,3,4]输出:5, nums = [0,1,2,3,4]

qq_39855356的博客 823

力扣26——删除有序数组中的重复项

/ 长度正确的期望答案。26. 删除有序数组中的重复项 - 力扣(LeetCode)int[] nums = [...];如果所有断言都通过,那么您的题解将被。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。函数应该返回新的长度。函数应该返回新的长度。

2301_77433167的博客 1078

力扣简单题系列:删除有序数组中的重复项(LeetCode 26)

这道题通过双指针的方法,高效地删除了有序数组中的重复元素,并返回了新数组的长度。对于初学者来说,掌握双指针的思想是解决类似问题的关键。

weixin_53910667的博客 813

LeetCode - 26 删除有序数组中的重复项

的前五个元素被修改为 0, 1, 2, 3, 4。不需要考虑数组中超出新长度后面的元素。当 j 越界时,此时 [0, i] 范围就是无重复元素的原地数组,长度为 i+1。// 长度正确的期望答案。的前两个元素被修改为 1, 2。不需要考虑数组中超出新长度后面的元素。函数应该返回新的长度 2,并且原数组。函数应该返回新的长度 5,并且原数组。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。

优快云 871

【leetCode26】删除有序数组中的重复项

leetCode第26题

日出等日落 242

LeetCode第26题_删除有序数组中的重复项

这是一道经典的数组处理题目:考察双指针技巧考察原地修改数组考察空间效率解题要点:利用数组已排序的特性使用双指针降低时间复杂度原地修改避免额外空间优化思路:可以添加快速判断相邻元素考虑特殊情况的优化注意边界条件的处理。

qq_40263592的博客 1200

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

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

qq_42742845的博客 897

leetcode_26删除有序数组中的重复项

leetcode26_删除有序数组中的重复项

bdn_nbd的博客 1257

LeetCode26_删除有序数组中的重复项

快慢指针的应用

Haolin_Liu的博客 646

力扣---LeetCode26. 删除有序数组中的重复项

第四弹 --- 力扣LeetCode每日一题

小沈.的博客 363
上一篇: 【华为OD机试真题】423、项目排期 、最快完成所有工作的天数 | 机试真题+思路参考+代码解析(CD卷)(C++)
下一篇: 二分查找算法的思路
吴_知遇
博客等级 码龄7年 100粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值