一.移除元素
题目链接:27.移除元素
题目描述:
给你一个数组 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 个元素之外留下了什么并不重要(因此它们并不计入评测)。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
思路:双指针法
以示例1为例:
定义两个指针dst和src,并将两个指针指向数组头部。
在src往后遍历中:
1.当nums[src] == val时,src++
2.当nums[src] != val时,dst++,src++
当src == numsSize时,跳出循环,此时dst等于有效数据k,最后返回dst即可。
在遍历中,dst始终在src前“站岗” ,即保存val,src则在前面“探路”,将数组中不是val的值“扔给”dst保存。
代码实现:
int removeElement(int* nums, int numsSize, int val)
{
//双指针
int dst = 0;
int src = 0;
while(src < numsSize)
{
if (nums[src] == val){
src++;
}
else{
nums[dst] = nums[src];
dst++;
src++;
}
}
return dst;
}
可以看到分支语句中有重复代码,可以进一步优化:
int removeElement(int* nums, int numsSize, int val)
{
//双指针
int dst = 0;
int src = 0;
while(src < numsSize)
{
if (nums[src] != val){
nums[dst] = nums[src];
dst++;
}
src++;
}
return dst;
}
二.删除有序数组中的重复项
题目链接:26.删除有序数组中的重复项
题目描述:
给你一个 非严格递增排列 的数组 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
。不需要考虑数组中超出新长度后面的元素。
提示:
1 <= nums.length <= 3 * 104
-104 <= nums[i] <= 104
nums
已按 非严格递增 排列
思路:双指针法
定义两个指针dst和src分别指向数组的起始位置和下一个位置。
在src往后遍历中:
1.nums[dst] == nums[src],src++
2.nums[dst] != nums[src],dst++,nums[dst] = nums[src],src++
当src == numsSize时,跳出循环,此时dst+1等于有效数据k,最后返回dst即可。
代码实现:
int removeDuplicates(int* nums, int numsSize)
{
int dst = 0;
int src = dst + 1;
while(src < numsSize)
{
if (nums[dst] != nums[src])
{
nums[++dst] = nums[src];
}
src++;
}
return dst+1;
}