> 文章列表 > 看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

目录

    • 前言
    • 算法题(LeetCode 27.移除元素)—(保姆级别讲解)
      • 分析题目
      • 算法思想(重要)
      • 暴力解法代码:
      • 指针法(快慢指针法)代码:
      • 反思
    • 结束语

前言

本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除即可,撰写本文章主要目的在于记录自己学习体会并分享给大家,全篇并不仅仅是复制粘贴,更多的是加入了自己的思考,希望读完此篇文章能真正帮助到您!!!

算法题(LeetCode 27.移除元素)—(保姆级别讲解)

力扣题目链接

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18
看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

分析题目

  1. 整形数组
  2. 删除元素后的新数组可以改变原有的顺序(建议使用双指针法(快慢指针法))
  3. 如果删除元素后的新数组不可以改变原有的顺序(建议使用双指针法(相向双指针法)相向双指针法本篇文章不讲解,在以后的文章中会讲解)
  4. 不需要考虑数组中超出新长度后面的元素

算法思想(重要)

这里主要讲解两种算法思想,分别是:

  1. 暴力解法
  2. 双指针法(快慢指针法)

暴力解法代码:

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;}
};

// 时间复杂度:O(n^2)
// 空间复杂度:O(1)

为了更能让大家了解暴力解法的算法思想,作者特意画了一张图供大家观看!!!
看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

双指针法(快慢指针法)代码:

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)
// 空间复杂度:O(1)

为了更能让大家了解暴力解法的算法思想,作者特意画了一张图供大家观看!!!
看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18
看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题27移除元素) 2023.4.18

反思

  1. 快指针:寻找新数组的元素,新数组就是不含有目标元素的数组(也就是不包括被删除的元素)
  2. 慢指针:获取新数组中需要更新的位置

结束语

如果觉得这篇文章还不错的话,记得点赞 ,支持下!!!