大家好,我是小卡皮巴拉
文章目录
目录
编辑
力扣题目:删除有序数组中的重复项
题目描述
示例 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; }
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!