大家好,我是小卡皮巴拉
文章目录
目录
[力扣题目: 移除元素](#力扣题目: 移除元素)
[示例 1:](#示例 1:)
[示例 2:](#示例 2:)
[兄弟们共勉 !!!](#兄弟们共勉 !!!)
每篇前言
博客主页:小卡皮巴拉
咱的口号:🌹小比特,大梦想🌹
作者请求:由于博主水平有限,难免会有错误和不准之处,我也非常渴望知道这些错误,恳请大佬们批评斧正。
力扣题目: 移除元素
原题链接:移除元素
题目描述
给你一个数组
nums
和一个值val
,你需要 原地 移除所有数值等于val
的元素。元素的顺序可能发生改变。然后返回nums
中与val
不同的元素的数量。假设
nums
中不等于val
的元素数量为k
,要通过此题,您需要执行以下操作:
- 更改
nums
数组,使nums
的前k
个元素包含不等于val
的元素。nums
的其余元素和nums
的大小并不重要。- 返回
k
。示例 1:
输入: nums = [3,2,2,3], val = 3
输出: 2, nums = [2,2,,]
解释: 你的函数函数应该返回 k = 2, 并且 nums中的前两个元素均为 2。你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
示例 2:
输入: nums = [0,1,2,2,3,0,4,2], val = 2
输出: 5, nums = [0,1,4,0,3,,,_]
解释: 你的函数应该返回 k = 5,并且 nums 中的前五个元素为 0,0,1,3,4。注意这五个元素可以任意顺序返回。
你在返回的 k 个元素之外留下了什么并不重要(因此它们并不计入评测)。
解题思路
我们在这里用到双指针法来进行数组去重:给定一个排序数组,需要在原地删除重复出现的元素,使每个元素只出现一次,并返回移除后数组的新长度。可以使用快慢指针来实现,快指针用于遍历数组,慢指针用于指向已处理元素的最后一个位置。
具体思路
初始化双指针:
- 使用两个指针
dst
和src
,都初始化为0。dst
指针用于记录当前不等于val
的元素应该放置的位置(即目标位置)。src
指针用于遍历整个数组。遍历数组:
- 遍历数组
nums
,使用src
指针从0开始遍历。- 如果
nums[src]
不等于val
,则将nums[src]
的值赋给nums[dst]
,并且dst
指针向后移动一位(dst++
,在Python中表示为dst += 1
)。- 如果
nums[src]
等于val
,则只移动src
指针,dst
指针保持不变。返回结果:
- 遍历完成后,
dst
指针的值即为不等于val
的元素数量。- 返回
dst
即可。题目要点
原地操作:不增加额外空间,直接在原数组上修改。
双指针:利用两个指针遍历数组,一个记录结果,一个用于遍历。
顺序可变:输出元素可不必保持原顺序。
返回数量:最终返回非目标值的元素数量。
完整代码(C语言)
csint removeElement(int* nums, int numsSize, int val) { int dst,src = 0; while(src < numsSize) { //src的值为val,src往后走 //src的值不为val,src赋值给dst,src和dst都往后走 if(nums[src] != val) { nums[dst] = nums[src]; dst++; } src++; } return dst; }
兄弟们共勉 !!!
码字不易,求个三连
抱拳了兄弟们!