首页 > 其他分享 >27. 移除元素

27. 移除元素

时间:2024-10-20 23:20:37浏览次数:1  
标签:27 val nums int 元素 slow 移除 quick left

题目

这道题通过是通过了,但是有很多可以改进的地方:

附上本人第一次写通过的代码:

/*

slow的作用:作为慢指针,职责是找到val所在的位置

quick的作用:作为快指针,职责是找到第一个可以和slow所指的元素互换位置的元素

*/

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        
        if (nums.empty()) return 0;

        int slow = 0, quick = 0;
        int n = nums.size();
        while (quick < n)
        {
            while (slow < n && nums[slow] != val) slow ++ ;
            quick = max(slow, quick);
            while (quick < n && nums[quick] == val) quick ++ ;
            if (slow < n && quick < n)
            {
                int tmp = 0;
                tmp = nums[slow];
                nums[slow] = nums[quick];
                nums[quick] = tmp;                
            }
            slow ++, quick ++;
        }

        return n - (quick - slow);
    }
};

虽然想到了用快慢指针,但是在对细节的处理上不够好,有点带猜的感觉,思路还是不够清晰。

注意不要自作聪明,认为可以把quick初始化成1,觉得quick不用管nums[0]所在的位置,但是如果数组只有一个元素,那么不会进while循环,没达到判断nums[0]是不是val的目的。

分析下为什么是 return n - (quick - slow);

img

官方题解

思路很清晰,而且很巧妙

首先是思路一:

总感觉嗅到了点贪心的味道(不太确定hhh)

img

其中区间 [0,left) 中的元素都不等于 val这句话值得学习,通过左右指针的相关操作来维持一个性质。

然后是思路二:

感觉精髓是针对一个不是val的元素就进行一次移动,然后就到了合适的位置,就不动了,而不是多次移动到一个合适的位置。

img

官方方法二代码是这样的:

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0, right = nums.size();
        while (left < right) {
            if (nums[left] == val) {
                nums[left] = nums[right - 1];
                right--;
            } else {
                left++;
            }
        }
        return left;
    }
};

自己改了点发现也可以

class Solution {
public:
    int removeElement(vector<int>& nums, int val) {
        int left = 0, right = nums.size() - 1;

        while (left <= right) 
        {
            if (nums[left] == val )
            {
                nums[left] = nums[right];
                right --;
            }
            else left ++ ;
        }

        return left;
    }
};

所以关键点还是在left和right相交的那个位置上,我们要让这个位置的数也要得到判定,即这个位置的数也要进入while循环。

附上一张自己分析的图:

img

标签:27,val,nums,int,元素,slow,移除,quick,left
From: https://www.cnblogs.com/hisun9/p/18488167

相关文章

  • 2024-10-19:用go语言,给定一个正整数 k 和初始数组 nums = [1], 可以执行两种操作:将数组
    2024-10-19:用go语言,给定一个正整数k和初始数组nums=[1],可以执行两种操作:将数组中任一元素加一,或复制数组中任意元素并将其附加到数组末尾。求使得数组元素之和大于或等于k所需的最少操作次数。输入:k=11。输出:5。解释:可以对数组nums=[1]执行以下操作:将元......
  • 第六章元素应用 CSS
    6.1使用CSS设置字体样式6.1.1.字体类型语法:font-fanily:字体名称;参数:字体名称按优先顺序排列,以逗号隔开。如果字体名称包含空格,则应用引号括起。说明:用font-family属性可控制显示字体。不同的操作系统,其字体名是不同的。对于Windows系统,其字体名就如Word中的“字体”......
  • 代码随想录算法训练营 | 739. 每日温度,496.下一个更大元素 I ,503.下一个更大元素II
    739.每日温度题目链接:739.每日温度文档讲解︰代码随想录(programmercarl.com)视频讲解︰每日温度日期:2024-10-20想法:遍历一遍数组,用栈来存数组下标做记录,因为要找更高得温度,当当前遍历的温度大于栈头存储(存的下标)的温度时,就可以知道栈头要过多少天遇到高温,低的时候直接入栈。J......
  • 讲解LeetCode第227题:基本计算器||(完整代码)
    LeetCode第227题:基本计算器||题目介绍方法一:数组模拟栈完整代码展示核心原理演示代码片段解释片段一:片段二:片段三:片段四:片段五:......
  • 2024-2025-1 20241327 《计算机基础与程序设计》第四周学习总结
    作业信息|2024-2025-1-计算机基础与程序设计)||--|-|2024-2025-1计算机基础与程序设计第四周作业)||快速浏览一遍教材计算机科学概论(第七版),课本每章提出至少一个自己不懂的或最想解决的问题并在期末回答这些问题|作业正文|https://www.cnblogs.com/shr060414/p/18440575|教......
  • 第六章元素应用CSS
    6.1使用CSS设置字体样式font-family:设置字体的类型font-weight:设置字体的粗细font-size:设置字体的大小font-style:设置字体的倾斜6.1.1.字体类型        字体:具有传递语义功能和美学效应两方面作用        CSS:提供font-family属性来控制文本的字体类型......
  • 第六章 元素应用css
    6.1使用css设置字体样式6.1.1.字体类型h1{ font-family:fangsong;}6.1.2.字体大小font-size:25px;6.1.3.字体粗细font-weight:500;6.1.4.字体倾斜font-style:italic;6.2使用CSS设置文本样式6.2.1.文本水平对齐方式text-align:center;6.2.2......
  • 自动驾驶路面分类数据集,不同道路不同天气条件,干燥、湿润、水上、新雪、融化雪和冰。包
    自动驾驶路面分类数据集,按照不同的天气条件,即干燥、湿润、水上、新雪、融化的雪和冰。不同的道路材料属性包括沥青、混凝土、泥浆和碎石。不同的道路平整性分为光滑、轻微不平和严重不平。共27类,37万张图像,13GB数据自动驾驶路面分类数据集类别:图像分类用途:用于训练和评估......
  • 第六章元素应用CSS
    6.1使用CSS设置字体样式作用:一是传递语义功能,二是有美学作用。CSS提供font-family属性来控制文本的字体类型。格式如下:fonl-family:字体名称;参数:字体名称按优先顺序排列,以逗号隔开。如果字体名称包含空格,则应用引号括起。说明:用font-family属性可控制显示字体。不同......
  • HTML·第六章 元素应用CSS
    6.1使用CSS设置字体样式在CSS中设置字体样式是网页设计中非常基础且重要的部分,它可以帮助设计师控制网页上文本的外观。以下是一些常用的CSS属性,用于设置字体样式:font-family:定义字体族,指定文本的字体。可以设置一个或多个字体,浏览器会使用列表中第一个可用的字体。p{......