leetcode力扣——27.移除元素、26.删除有序数组的重复项、80.删除有序数组中的重复项 II

目录

leetcode27------移除元素

题目

思路

leetcode26------删除有序数组的重复项

题目

思路

[leetcode80------删除有序数组的重复项 II](#leetcode80——删除有序数组的重复项 II)

题目

思路


leetcode27------移除元素

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

删除有序数组中的重复项 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;
    }
};
相关推荐
小O的算法实验室21 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎21 小时前
LIST 的相关知识
数据结构·list
M--Y1 天前
Redis常用数据类型
数据结构·数据库·redis
郭涤生1 天前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿1 天前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz1 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能1 天前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****1 天前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯
汀、人工智能1 天前
[特殊字符] 第79课:分割等和子集
数据结构·算法·数据库架构·位运算·哈希表·分割等和子集
汀、人工智能1 天前
[特殊字符] 第74课:完全平方数
数据结构·算法·数据库架构·图论·bfs·完全平方数