目录
[leetcode80------删除有序数组的重复项 II](#leetcode80——删除有序数组的重复项 II)
leetcode27------移除元素
题目
要求:
给你一个数组
nums和一个值val,你需要 原地 移除所有数值等于val的元素。元素的顺序可能发生改变。然后返回nums中与val不同的元素的数量。假设
nums中不等于val的元素数量为k,要通过此题,您需要执行以下操作:
- 更改
nums数组,使nums的前k个元素包含不等于val的元素。nums的其余元素和nums的大小并不重要。- 返回
k。
示例:


重点:原地 移除所有数值等于 val的元素;并返回k
思路
如果从"移除所有值等于val的元素"想到"保留所有不等于val的元素"这题就很简单了。
- 遍历nums中的每个元素,用i表示当前元素下标
- 如果 nums[i] == val,则不予理会
- 如果 nums[i] != val,则保留当前元素
代码:
cpp
class Solution
{
public:
int removeElement(vector<int>& nums, int val)
{
int k = 0; //用k遍历有效元素(不等于val的元素)
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] != val)
{
nums[k++] = nums[i];
}
}
return k;
}
};
leetcode26------删除有序数组的重复项
题目
给你一个 非严格递增排列 的数组
nums,请你原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回nums中唯一元素的个数。考虑
nums的唯一元素的数量为k。去重后,返回唯一元素的数量k。
nums的前k个元素应包含 排序后 的唯一数字。下标k - 1之后的剩余元素可以忽略。
示例:
思路
分析:
数组具有" 非严格递增排列 "的性质,如果原地删除重复元素且"相对顺序保持一致",则数组会出现" 严格递增 "的特点
- 依旧用k表示有效元素的下标,当nums[i] == nums[k]时,就不予理会;当nums[i] != nums[k]时,就将nums[i]当前值保留下来。

(如果对比27题的话,其实这个题就是从"与val比较",变成了"后面的元素进行比较")
- 只是需要注意的是,k表示的是数组下标,从0开始的,最后可能要返回的是k + 1
代码:
cpp
#include <iostream>
#include "vector"
using namespace std;
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
//原数组非递减,去重后应是递增序列,eg:1、1、2
int k = 0;
for(int i = 1; i < nums.size(); i++)
{
if(nums[i] != nums[k])
nums[++k] = nums[i];
}
return k + 1;
}
};
leetcode80------删除有序数组的重复项 II
题目
给你一个有序数组
nums,请你原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。


思路
分析:
要使得处理后得到的数组中的元素------只出现1次或两次。且空间复杂度O(1)
- 可以用一个flag统计一个元素出现的次数
- 如果当前元素出现的次数为1或2则记录下来,如果大于2则不予理会
cpp
//输入:nums = [0,0,1,1,1,1,2,3,3]
//输出:7, nums = [0,0,1,1,2,3,3]
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
int length = 1;
int flag = 1; //表示数字出现的次数,有1、2
for(int i = 1; i < nums.size(); i++)
{
if(nums[i] == nums[i - 1])
flag++;
else
flag = 1;
if(flag <= 2) //出现次数小于2
nums[length++] = nums[i];
else
continue;
}
return length;
}
};
再简洁些就可以写成下面这样:
cpp
class Solution
{
public:
int removeDuplicates(vector<int>& nums)
{
int length = 1;
int flag = 1; //表示数字出现的次数,有1、2
for(int i = 1; i < nums.size(); i++)
{
// 合并:先更新出现次数,再判断是否保留当前元素
flag = (nums[i] == nums[i - 1]) ? flag + 1 : 1;
if(flag <= 2)
nums[length++] = nums[i];
}
return length;
}
};