首页 > 其他分享 >快慢指针用于数组的原地处理

快慢指针用于数组的原地处理

时间:2023-10-09 11:47:59浏览次数:44  
标签:快慢 slow val nums int fast 数组 指针

  • 删除指定元素

27. 移除元素

  • 删除有序数组的重复项

26. 删除有序数组中的重复项

  • 删除有序数组重复项超过K次的部分

80. 删除有序数组中的重复项 II

整体来说,这类题目所用的方法都是快慢指针,只是其实现细节不尽相同而已。
对我来说,做这种题目最好自己在纸上写写,不然很容易细节上出现问题。
从细节上来说,快慢指针在什么情况下需要进行逻辑处理才是这类题目的关键,也即nums[fast] 与 val/nums[slow]处于什么条件时我们需要进行处理。我个人常常陷入一个误区:我的关注点常常在于处理nums[fast] == val/nums[slow]的情况,也就是题目要求处理的那一类情况,但是,对于数组来说,储存是连续的,也就是说,赋值与覆盖是持续的,考虑的仅仅是fast什么时候赋值,什么时候仅仅移动。
我暂时的理解是:只有作为fast指针满足目标条件是,slow指针都得进行承接工作。其实题目往往隐藏了,不满足目标条件时的处理,也即fast指针的前进,其实fast的前进是每次都进行的,所以也没必要加一个if循环了。

// 27. 移除元素
int removeElement(vector<int>& nums, int val) {
    int fast = 0, slow = 0;
    while (fast < nums.size()) {
        if (nums[fast] != val) {   // 满足目标条件,即删除val,即fast != val时承接。
            nums[slow] = nums[fast];
            slow++;
        }
        fast++;
    }
    return slow;
}
// 26. 删除有序数组中的重复项
int removeDuplicates(vector<int>& nums) {
    if (nums.size() == 0) {
        return 0;
    }
    int slow = 0, fast = 0;
    while (fast < nums.size()) {
        if (nums[fast] != nums[slow]) { // 满足目标条件,不重复,承接
            slow++;
            // 维护 nums[0..slow] 无重复
            nums[slow] = nums[fast];
        }
        fast++;
    }
    // 数组长度为索引 + 1
    return slow + 1;
}
// 80. 删除有序数组中的重复项 II
int removeDuplicates(vector<int>& nums) {
        int n = nums.size();
        if (n <= 2) {
            return n;
        }
        int slow = 2, fast = 2;
        while (fast < n) {
            if (nums[slow-2] != nums[fast]) {  // 满足要求。
                nums[slow] = nums[fast];
                ++ slow;
            }
            ++ fast;
        }
        return slow; // 比实际下标+1
    }

标签:快慢,slow,val,nums,int,fast,数组,指针
From: https://www.cnblogs.com/H-force/p/17750786.html

相关文章

  • js数组转字符串方法(转)
    JavaScript 允许数组与字符串之间相互转换。其中Array 方法对象定义了3 个方法,可以把数组转换为字符串,如表所示。数组方法说明toString()将数组转换成一个字符串toLocalString()把数组转换成本地约定的字符串join()将数组元素连接起来以构建一个字符串......
  • vue $refs 获取的结果有时候是数组
    在工作的时候要从接口读取数据,生成一个动态的表单首先做的就是绑定ref然后使用const{proxy}=getCurrentInstance();来读取ref,看了半天数据怎么不对,控制台打印后,发现是一个数组后来观察到只要是使用v-for生成的获取ref时,即使没有重复,结果也是数组,可能是作者在v-for中为了......
  • 指针(一)
    指针今日份复习指针变量,指针的自增、自减运算。指针变量1.一个变量的地址被称为该指针变量。指针变量的定义:类型说明*变量名给一个指针变量赋值有以下两种方法:  a.定义指针变量的同时进行赋值。      【例】       inta;      ......
  • 紫书Unit3.字符数组
    charc语言中字符型关键字用char表示,实际储存的是字符的ascll码。字符串是以‘\0’结尾。同时,字符常量可以用单引号表示,'a',在语法上可以将字符当作int使用,`'a'+1会输出98; scanf输入charscanf("%s",s),遇到空字符会停下来。 //3.5TEX中的引号,将特定符号转化//输入"To......
  • 研发三维GIS系统笔记/框架改造/智能指针重构框架-003
    1.使用智能指针重构系统原有的系统都是裸指针,在跨模块与多线程中使用裸指针管理起来很麻烦,尤其是多任务系统中会出现野指针1classCELLTileTask:publicCELLTask2{3public:4CELLQuadTree*_node;5TileId_tileId;6CELL......
  • vue前端接收数组;
    后端 $this->assign('info',$expert);如果是数组/对象,需要在接收页面这样写:在data内变量赋值: info: <?phpechojson_encode($info);?>  另外有其他写法:  $this->assign('info',1); 如果是单个值:在data内变量赋值: info: ‘{$info}’翻译搜索......
  • php获取数组中某一个元素的值,并用逗号分隔
    //打印方法functionpp($ay){ echo"<pre>"; print_r($ay);}//定义数组$user_list=array( '0'=>[ 'id'=>1, 'name'=>'刘德华' ], '1'=>[ 'id'=>2, 'na......
  • Go复合类型之数组类型
    Go复合类型之数组@目录Go复合类型之数组一、数组(Array)介绍1.1基本介绍1.2数组的特点二、数组的声明与初始化2.1数组声明2.2常见的数据类型声明方法2.3数组的初始化方式一:使用初始值列表初始化数组方法二:根据初始值个数自动推断数组长度方法三:通过指定索引值初始化数组三、......
  • GO数组解密:从基础到高阶全解
    在本文中,我们深入探讨了Go语言中数组的各个方面。从基础概念、常规操作,到高级技巧和特殊操作,我们通过清晰的解释和具体的Go代码示例为读者提供了全面的指南。无论您是初学者还是经验丰富的开发者,这篇文章都将助您更深入地理解和掌握Go数组的实际应用。关注公众号【TechLeadClou......
  • (unordered_)set,(unordered_)map,数组(vector)
    set:保证元素的唯一性,并且元素从小到大排序unordered_set:保证元素的唯一性,并且元素的顺序未知,不一定和输入相同map:键从小到大排序unordered_map:键的顺序未知,不一定和输入相同数组(vector):元素的顺序和输入相同......