【力扣刷题实战】(顺序表)删除有序数组中的重复项

大家好,我是小卡皮巴拉

文章目录 

目录

​编辑

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

题目描述

 示例 1:

示例 2:

解题思路

具体思路

题目要点

完整代码(C语言)

 兄弟们共勉 !!! 


每篇前言

博客主页:小卡皮巴拉

咱的口号:🌹小比特,大梦想🌹

作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。

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

原题链接:删除有序数组中的重复项

题目描述

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

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

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

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

解题思路

问题理解:

首先,明确题目要求原地删除重复元素,并保持元素的相对顺序。

这意味着我们不能使用额外的数据结构来存储结果,而必须直接在原数组上进行操作。

算法选择:

由于需要保持元素的相对顺序,因此不能简单地排序后再去重。

双指针方法是一个常用的技巧,特别是在需要原地修改数组时。

通过一个指针记录当前处理的唯一元素的位置,另一个指针用于遍历数组,可以有效地解决问题。

具体思路

为了原地删除重复元素并保持元素的相对顺序,我们可以使用 src(源指针)和 dst(目的指针)两个指针。src 指针用于遍历整个数组,而 dst 指针用于记录下一个唯一元素应该存放的位置。

初始化指针

  • dst 指针指向数组的第一个元素,这个指针用于记录下一个唯一元素应该存放的位置。
  • src 指针从数组的第二个元素开始遍历,用于检查是否有重复元素。

遍历数组

  • src 指针向右移动,遍历数组中的每个元素。
  • 在每次移动 src 指针时,检查 nums[src] 是否与 nums[dst]不同。
  • 如果不同,说明 nums[src] 是一个新的唯一元素,因此我们需要将dst先向右移动一位,再将nums[src]的值赋给 nums[dst]
  • 如果相同,说明nums[src]不是一个新的唯一元素,src++向右移动一位,继续向后寻找唯一元素。

返回结果

  • 当 src 指针遍历完整个数组后,dst+1 指针的位置(即 dst 的值)就是唯一元素的数量 k
  • 因此,我们只需要返回 dst+1 的值即可。

题目要点

双指针src遍历,dst记录唯一位置。

遍历检查:比较nums[src]nums[dst]

更新数组:不同则赋值并移动dst

返回结果dst+1为唯一元素数量。

完整代码(C语言)

int removeDuplicates(int* nums, int numsSize) 
{
    int dst = 0,src = dst + 1;
    while(src < numsSize)
    {
        if(nums[src] != nums[dst] && ++dst != src)
        {
            nums[dst] = nums[src];
        }
        src++;
    }
    return dst+1;
}

 兄弟们共勉 !!! 

码字不易,求个三连

抱拳了兄弟们!

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值