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

leetcode 数组 27.移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作:
更改 nums 数组,使 nums 的前 k 个元素包含不等于 val 的元素。nums 的其余元素和 nums 的大小并不重要。
返回 k。

不能直接删除,数组的元素在内存地址中是连续的,不能单独删除数组中的某个元素,只能覆盖

暴力解法,复杂度O(n2):
两层for循环,一个for循环遍历数组元素 ,第二个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--; // 因为下标i以后的数值都向前移动了一位,所以i也向前移动一位size--; // 此时数组的大小-1}}return size;}
};

下面我一开始的代码,不规范直接超时,即便是上面的也有超时不通过风险:

class Solution {
public:
int removeElement(vector& nums, int val) {
int count=0;
for(int i=0;i<nums.size();i++){
if(nums[i]==val){
for(int j=i;j<nums.size();j++){
nums[j]=nums[++j];
i–;
count++;
}
}
}return count;
}
};

双指针法(快慢指针法): 通过一个快指针和慢指针在一个for循环下完成两个for循环的工作

快指针:寻找新数组的元素 ,新数组就是不含有目标元素的数组
慢指针:指向更新 新数组下标的位置

快慢指针,满指针便是新数组,快指针先走判断,直接把与val不同的覆盖前面的class Solution {
public:int removeElement(vector<int>& nums, int val) {int slowIndex = 0;for (int fastIndex = 0; fastIndex < nums.size(); fastIndex++) {if (val != nums[fastIndex]) {nums[slowIndex++] = nums[fastIndex];}}return slowIndex;}
};

时间复杂度:O(n)

双指针法(快慢指针法)在数组和链表的操作中是非常常见的,很多考察数组、链表、字符串等操作的面试题,都使用双指针法


http://www.mrgr.cn/news/41925.html

相关文章:

  • 中断和异常
  • Ray_Tracing_In_One_Weekend下
  • Git版本控制工具--关于命令
  • 武汉自闭症儿童寄宿学校:让孩子快乐成长
  • 易贝恩副总经理朱洪泽受邀为第四届中国项目经理大会演讲嘉宾
  • VirtulBOX Ubuntu22安装dpdk23.11
  • Ericsson EPSFB 通话掉话现象优化案例
  • 探索 aMQTT:Python中的AI驱动MQTT库
  • MySQL 实验 2:数据库的创建与管理
  • C++模版进阶
  • 统计学习理论之VC维究竟是什么
  • Go语言实现长连接并发框架 - 任务执行流上下文
  • Valhalla实现 -Docker部署利用OSM(Mapbox)地图实现路径规划可视化
  • 重生到现代之从零开始的C语言生活》—— 内存的存储
  • 深入理解 Solidity 中的支付与转账:安全高效的资金管理攻略
  • 吉他弹唱打谱软件哪个好用 吉他弹唱制谱教程
  • 抗生素治疗百病吗?
  • 工具的力量——提升工作效率的编程工具选择与运用
  • JavaScript(JS)学习笔记 6 常用的JS内置对象(FileReader对象 FormData对象 Promise对象)
  • Comparable接口和Comparator接口