1.什么是双指针?

双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。

2.快慢指针

2.1解释

快慢指针也是双指针,但是两个指针从同一侧开始遍历数组,将这两个指针分别定义为快指针(fast)和慢指针(slow),两个指针以不同的策略移动,直到两个指针的值相等(或其他特殊条件)为止,如fast每次增长两个,slow每次增长一个。

2.2题目解析

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。 你不需要考虑数组中超出新长度后面的元素。

示例 2: 给定 nums = [0,1,2,2,3,0,4,2], val = 2, 函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。

(本题可采用双指针法)

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

代码实现:

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

3.总结

双指针(尤其是快慢指针)通过高效的双指针协同,能在不额外分配空间的条件下解决数组/链表问题。关键是通过指针的分工(遍历 vs. 记录),将时间复杂度优化至线性,是算法中常用优化技巧。

《数组》--DAY2--快慢指针法的更多相关文章

  1. Floyd 循环检测算法(快慢指针法/龟兔指针法)

    Floyd Cycle Detection Algorithm   Floyd Cycle Detection Algorithm,即 Floyd 循环检测算法,又称快慢指针法.龟兔指针法.该算法用于 ...

  2. 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)

    寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...

  3. 【C语言】分别用下标法,地址法和指针法输出数组中的全部元素

    #include<stdio.h> int main() { ] = { ,,,, }; int i, * p; printf("下标法:\n"); ; i < ...

  4. JavaScript从数组中删除指定值元素的方法

    本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个 ...

  5. js从数组中删除指定值(不是指定位置)的元素

    RT: js从数组中删除指定值的元素,注意是指定值,而不是指定位置. 比如数组{1,2,3,4,5},我要删除其中的元素3,但是这个3的位置我是不知道的,只知道要删除值为3的这一个元素,请问要怎么写? ...

  6. Trees on the level(指针法和非指针法构造二叉树)

    Trees on the level Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Other ...

  7. js数组去重 数组拼接 替换数组中的指定值 递归数组 判断数组中是否存在指定值 数组求和 根据条件判数组值

    这是学习过程中记录的一些关于数组操作的常用属性或方法,记录一下方便以后使用. // 数组去重 var arr1 = [1,1,2,3,4,5,6,3,2,4,5,'a','b','c','a',6,7 ...

  8. C++中的字符数组、字符指、字符串针(腾讯)

    一.字符数组 1.定义时进行初始化的方式 (1)char c[12]={'I',' ','a','m',' ','h','a','p','p','y'};//最后两个元素自动补‘\0’(不是空格),其 ...

  9. opencv学习笔记(02)——遍历图像(指针法)

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <ope ...

  10. 牛客剑指offer(持续更新~)

    第一题:二维数组的查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数, ...

随机推荐

  1. Java线程池实现原理与源码解析(jdk1.8)

    为什么需要线程池?线程池能够对线程进行统一分配,调优和监控:- 降低资源消耗(线程无限制地创建,然后使用完毕后销毁)- 提高响应速度(无须创建线程)- 提高线程的可管理性 Java是如何实现和管理线程 ...

  2. w3cschool-Lua 教程

    https://www.w3cschool.cn/lua/ Lua 学习笔记之一(初阶话题) 1.八种基本类型: 如下表 基本类型 描述 备注 数值(number) 内部以double表示 字符串(s ...

  3. 配置教程-jdk-tomcat-maven

    二.下载并安装JDK 选择一个适合自己的JDK版本下载并安装即可,具体流程不详述. 二.环境变量配置 1.右键桌面上"我的电脑">>"属性",在弹出 ...

  4. Spring Cloud认知学习(二):Feign的使用、熔断器Hystrix

    Feign Feign用于声明式调用服务在上面的服务调用中,我们始终还是没有摆脱restTemplate,我们调用别的服务始终要使用restTemplate来发起.想想我们以前是怎么开发的(三层架构, ...

  5. AI定制祝福视频,广州塔、动态彩灯、LED表白,直播互动新玩法(附下载链接)

    在追剧的时候经常能看到一些浪漫的告白桥段,男主用圣诞彩灯表白.用城市标志性建筑的LED表白,或者在五光十色的烟花绽放后刻下女主角的名字,充满了仪式感和氛围感~ 现在,这样的表白效果用AI软件就能实现了 ...

  6. Hive2升hive3报错

    一.网上总结的报错 1.coalesce报错 FAILED: SemanticException [Error 10014]: Line 197:4 Wrong arguments ''10'': U ...

  7. IDEA 编辑java项目跳过测试

    一.Idea配置

  8. Atcoder ABC387F Count Arrays 题解 [ 绿 ] [ 基环树 ] [ 树形 dp ] [ 前缀和优化 ]

    Count Arrays:一眼秒的计数题. 思路 显然,把小于等于的条件化为大的向小的连单向边,每个数的入度都是 \(1\),就会形成一个基环树森林. 那么考虑这个环上能填什么数.因为所有数都小于等于 ...

  9. RMAN备份时遇到ORA-48132 &ORA-48170且备份变慢案例

    现象描述: 环境: 操作系统:Red Hat Enterprise Linux release 8.10 数据库版本: Oracle 19.24.0.0.0 企业版 备份作业在执行RMAN备份时,告警 ...

  10. 【ABP】项目示例(1)——项目搭建前置准备

    项目介绍 本项目使用.NET8+ABP+MySql搭建,基于DDD的设计思想,创建分层Web应用程序. 相关文档 .NET开发文档 Entity Framework Core开发文档 ABP开发文档 ...