【顺序表习题|图解|双指针】移除元素 + 删除有序数组中的重复项


🌈个人主页:聆风吟_
🔥系列专栏:数据结构手札・刷题篇
🔖少年有梦不应止于心动,更要付诸行动。


文章目录

  • 📚专栏订阅推荐
  • [一. ⛳️移除元素](#一. ⛳️移除元素)
    • [1.1 题目](#1.1 题目)
    • [1.2 示例](#1.2 示例)
    • [1.3 限制](#1.3 限制)
    • [1.4 解题思路](#1.4 解题思路)
  • [二. ⛳️删除有序数组中的重复项](#二. ⛳️删除有序数组中的重复项)
    • [1.1 题目](#1.1 题目)
    • [1.2 示例](#1.2 示例)
    • [1.3 限制](#1.3 限制)
    • [1.4 解题思路](#1.4 解题思路)
  • 📝结语

📚专栏订阅推荐

专栏名称 专栏简介
数据结构入门手札 本专栏主要是我的数据结构入门学习手札,记录个人从基础到进阶的学习总结。
数据结构手札・刷题篇 本专栏是《数据结构入门手札》配套习题讲解,通过练习相关题目加深对算法理解。

一. ⛳️移除元素

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

  • 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
  • 元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

1.2 示例

输入: nums = 3, 2, 2, 3 , val = 3
输出: 2, nums = 2, 2
说明: 函数应该返回新的长度 2 , 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = 2,2,3,3 或 nums = 2,2,0,0,也会被视作正确答案。

1.3 限制

  • 0 <= nums.length <= 100
  • 0 <= numsi <= 50
  • 0 <= val <= 100

1.4 解题思路

双指针解法

定义双指针 precur 分别位于数组的起始端,使用指针cur 遍历数组nums

  1. 如果nums[cur] == val,则执行cur 自增加1
  2. 如果nums[cur] != val,则执行nums[pre++] = nums[cur],并执行cur 自增加1
  3. cur 指向数组的末尾时,终止循环,返回pre即可;

c语言代码:

cpp 复制代码
int removeElement(int* nums, int numsSize, int val){
    //初始化两个指针,分别指向数组初始位置
    int pre = 0;
    int cur = 0;

    //循环
    for(cur = 0; cur < numsSize; cur++)
    {
        if(nums[cur] != val) nums[pre++] = nums[cur];
    }

    //返回结果
    return pre;
}

二. ⛳️删除有序数组中的重复项

⌈ 在线OJ链接,可以转至此处自行练习 ⌋

1.1 题目

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

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

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

1.2 示例

输入: nums = 1, 1, 2
输出: 2, nums = 1, 2, _
解释: 函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。

1.3 限制

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

1.4 解题思路

采用双指针

定义双指针 leftright 分别位于数组的下表为 0 和为 1 的位置,循环执行(当right走到数组末尾时停止):

  1. 如果nums[left] != nums[right],执行nums++left = numsright++
  2. 如果nums[left] == nums[right],执行right自增加1。

若循环结束,则返回right+1即可。

c语言代码:

cpp 复制代码
int removeDuplicates(int* nums, int numsSize){
    //定义left指向数组下标为0的位置
    int left = 0;
    //定义right指向数组下标为1的位置
    int right = 1;

    //循环:当right指向数组末尾时停止
    while(right < numsSize)
    {
        if(nums[left] != nums[right])
        {
            //优化前
            // left++;
            // nums[left] = nums[right];
            // right++;

            //优化后
            nums[++left] = nums[right++];
        }
        else
        {
            right++;
        }
    }

    //返回结果
    return left+1;
}

📝结语

     今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟_的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!

相关推荐
叫我:松哥2 分钟前
基于机器学习和flask的体育健身风险智能分析系统,系统集成DeepSeek、聚类算法、分类算法等,准确率达90%
人工智能·python·神经网络·算法·机器学习·flask·聚类
wabs6665 分钟前
关于动态规划【0-1背包思想在实际问题中是怎么转化的?】
算法·动态规划
阿文的代码库7 分钟前
欧拉回路与欧拉路径的算法流程演示
算法
牛油果子哥q10 分钟前
二叉树(Binary Tree)零基础精讲,树基础概念、树形分类、核心性质、递归/层序遍历、完整代码与面试考点全解
c++·面试·数据挖掘
JieDavid11 分钟前
专利流程岗上岸实录|奇智创达知识产权系统实操经验分享
大数据·运维·人工智能·经验分享·产品运营·产品经理
汤姆yu13 分钟前
云知声 U2 原生智能体大模型深度解析
大数据·人工智能·算法·ai·大模型·多模态·智能体
小糯米60115 分钟前
C语言文件操作
c语言·开发语言·数据结构
syt_biancheng18 分钟前
贪心算法(1)---简介
算法·贪心算法
三块石头10125 分钟前
BUCK电路MOS管功率耗散理论推导
经验分享·硬件架构·硬件工程·学习方法·信息与通信
一切皆是因缘际会26 分钟前
神经符号融合智能体
大数据·数据结构·人工智能·ai