
🌈个人主页:聆风吟_
🔥系列专栏:数据结构手札・刷题篇
🔖少年有梦不应止于心动,更要付诸行动。
文章目录
- 📚专栏订阅推荐
- [一. ⛳️移除元素](#一. ⛳️移除元素)
-
- [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 解题思路)
- 📝结语
📚专栏订阅推荐
| 专栏名称 | 专栏简介 |
|---|---|
| 数据结构入门手札 | 本专栏主要是我的数据结构入门学习手札,记录个人从基础到进阶的学习总结。 |
| 数据结构手札・刷题篇 | 本专栏是《数据结构入门手札》配套习题讲解,通过练习相关题目加深对算法理解。 |
一. ⛳️移除元素
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 <= nums[i] <= 50
- 0 <= val <= 100
1.4 解题思路
双指针解法
定义双指针 pre 和 cur 分别位于数组的起始端,使用指针cur 遍历数组nums:
- 如果
nums[cur] == val,则执行cur 自增加1; - 如果
nums[cur] != val,则执行nums[pre++] = nums[cur],并执行cur 自增加1。 - 当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;
}
二. ⛳️删除有序数组中的重复项
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 <= nums[i] <= 104
- nums 已按 非严格递增 排列
1.4 解题思路
采用双指针
定义双指针 left 和 right 分别位于数组的下表为 0 和为 1 的位置,循环执行(当right走到数组末尾时停止):
- 如果
nums[left] != nums[right],执行nums[++left] = nums[right++]; - 如果
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;
}
📝结语
今天的干货分享到这里就结束啦!如果觉得文章还可以的话,希望能给个三连支持一下,聆风吟_的主页还有很多有趣的文章,欢迎小伙伴们前去点评,您的支持就是作者前进的最大动力!
