当前位置: 首页 > article >正文

【简单】27.移除元素

题目描述

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。

假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:

  • 更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
  • 返回 k。

解题方法

方法1:暴力法

用两个for指针,第一个for指针用来遍历整个数组,如果遇到和val值相等的元素,通过第二个for指针将后面的元素都往前移动一格,具体的动画演示可以参考代码随想录,链接如下:

代码随想录:移动指针
代码示例:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int size = nums.size();
        for (int i = 0; i < size; i++)
        {
            if (nums[i] == val)
            {
                for(int j = i+1; j < size; j++)
                {
                    nums[j-1] = nums[j];
                }
                i--;
                size--;
            }
        }
        return size;
    }
};
  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

方法2:双指针法

用两个指针,fast和slow来遍历。其中fast指针用来查找新数组需要的元素,slow用来指新数组的下标,比如val=3的话,如果fast和slow遇到不是3的元素,均向前移动一位;如果fast遇到3,新数组不需要这个元素,那么fast向后移,slow不移,再将fast对应的值覆盖到slow对应的位置上,就实现删除的目的。
动画演示依然可参考代码随想录,链接在上面
代码示例:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) 
    {
        int slow = 0;
        for(int fast = 0; fast < nums.size(); fast++)
        {
            if(nums[fast] != val)
            {
                nums[slow++] = nums[fast]; 
            }
        }
        return slow;
    }
};

注意这些实现方法并没有改变元素的相对位置!

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

http://www.kler.cn/a/538165.html

相关文章:

  • Python 鼠标轨迹 - 防止游戏检测
  • 【C++】命名空间
  • 【kafka实战】06 kafkaTemplate java代码使用示例
  • idea整合deepseek实现AI辅助编程
  • android中关于CheckBox自定义选中图片选中无效问题
  • 【web自动化】指定chromedriver以及chrome路径
  • 《Java核心技术 卷II》本地化的数字格式
  • 3.攻防世界 Confusion1(服务器模板注入SSTI)
  • 直接抓取网页的爬虫技术:限制与合规挑战
  • 订单超时设计(1)--- 如何使用redis实现订单超时实时关闭功能
  • 软件测试就业
  • 前端学习-页面加载事件和页面滚动事件(三十二)
  • vue3:点击子组件进行父子通信
  • spring cloud和spring boot的区别
  • 计算机领域QPM、TPM分别是什么并发指标,还有其他类似指标吗?
  • 即时通讯开源项目OpenIM配置可视化-etcd配置中心
  • C++ 顺序表
  • Spring 6.2.2 @scope(“prototype“)原理
  • [渗透测试]热门搜索引擎推荐— — fofa篇
  • 【生成模型之十四】Visual Autoregressive Modeling
  • 13.3 使用 Chat Prompt Template 设计专业翻译提示模板
  • 4.3 线性回归的改进-岭回归/4.4分类算法-逻辑回归与二分类/ 4.5 模型保存和加载
  • OC-Block
  • 全志A133 android10 thermal温控策略配置调试
  • ML.NET库学习003:基于时间序列的共享单车需求预测项目解析
  • 即时通讯开源项目OpenIM配置离线推送全攻略