给你一个有序数组 nums
,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
定义两个指针,一个slow一个fast,分别指向有效数组和整个数组。意为slow是要输出的数组的长度,而fast用于对原数组遍历到底。
用fast对数组进行遍历,两相邻元素不相同,则将fast指向的元素赋给slow指向的元素,slow指针向前走一个元素。若两相邻元素相同时,则继续遍历(相当于用slow指针挨个保存不相同的元素,遇到相同元素直接无视)
源代码:
class Solution {
public:
int removeDuplicates(vector<int>& nums)
{
int n=nums.size();
if (n==0)return 0;
int fast=1,slow=1;
while (fast<n)
{
if (nums[fast]!=nums[fast-1])
{
nums[slow]=nums[fast];
slow++;
}
fast++;
}
return slow;
}
};
给你一个数组 nums
和一个值 val
,你需要 原地 移除所有数值等于 val
的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1)
额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
依旧是双指针,慢指针保存有效数组,快指针用于枚举整个数组,若枚举到的值不为val,则快指针指向的元素赋给慢指针指向的元素,慢指针向前走一位。(其实就是26题改了下判断条件而已)
源代码:
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int slow=0;
int n=nums.size();
for (int fast=0;fast<n;fast++)
{
if (fast!=val)
{
nums[slow]=nums[fast];
slow++;
}
}
return slow;
}
};