首页
学习
活动
专区
圈层
工具
发布

我爱学算法之—— 感受双指针带来的快感(下)

三数之和 - 力扣(LeetCode) 题目解析 题目要求我们在一个给定的数组中,找到和等于0的三元组;但是呢有一些要求 首先,这三元组中的元素是给定数组中的不同元素 其次,找到的三元组不能够重复 算法分析...我们这里借用两数之和中利用双指针算法找和为target的思路;依次固定(从左到右)给定数组中的数字i,然后利用双指针算法,在其右边区间内找到和为-i的两个数,找到返回即可。...查找的三元组完全:对与这个问题,我们在利用双指针算法找到满足要求的数之后,让双指针继续遍历而不是直接结束即可。...其次,双指针算法找到满足条件的元素后,没有直接跳出,而是跳过重复元素继续遍历。 二、四数之和 18....通过学习双指针算法,明显能够感受到双指针算法的优势和其适用场景 首先,就是能够在暴力解法的基础上,将时间复杂度降低一个维度; 其次,双指针算法就适合在数组划分和数组有序时使用; 最后,双指针算法使用起来十分便捷

17410
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    我爱学算法之 —— 感受双指针带来的快感(一)

    首先来学习 双指针 算法(这里通过一些习题,再实践中锻炼自己的思维,提升自己的算法能力)。 一、移动0 ​ 题目链接:283....(并且要求我们不复制数组,在原数组上进行操作) 算法解析: ​ 对于这道题(以至于,数组划分 这一类题,我们都可以使用双指针算法来做) 思路: ​ 使用两个整数(模拟指针)dest 和cur ,在遍历数组的同时...算法解析: dest 指针: 指向已经复写位置的最后一个元素 cur 指针: 指向已经复写位置的最后一个元素 思路: 1:先找到需要复写的最后一个元素(如果从前向后进行复写,会将没有进行复写的数据覆盖掉...算法解析: ​ 双指针,fast 和slow 看到这里,可能会有些疑惑,这个题跟双指针有啥关系呢?...而且还是快慢双指针;我知道你很急,但你先别急,接着向下看 ​ 对于一个数,我们先来看一下它的变化过程 ​ 通过观察,我们能发现,无论是不是快乐数,最后都会陷入到一个循环当中去;唯一的区别就是,快乐数最后陷入到了只有

    16410

    我爱学算法之—— 感受双指针带来的快感(中)

    前言: ​ 欢迎来到我爱学算法系列,本篇接着来学习双指针算法 一、有效的三角形个数 题目链接611....对于双指针算法操作解析: 因为数组已经有序,right指向的是较大的数,如果一个数加上这个数还小于第三个数,那其他的数的比right指向的数小,就不需要再进行判断了,所以直接left++; ​ left...算法解析 首先想到的肯定是暴力解法 枚举所有的二元组,找到和为target 的二元组,然后返回。 双指针算法优化: 使用暴力枚举肯定是不行的,这里使用双指针算法优化。...(注意: 题目中已经说了商品价格是升序排序的(数组有序,优先想到使用二分和双指针算法))。...数组有序(如果数组无序,就让它先有序 ),这样,我们使用双指针遍历数组; 比较left和right位置的值的和num 与target,如果num>target,那就直接让right--;(因为left指向的是未遍历数中的最小值

    23010

    我和双指针的初次亲密邂逅:那一刻心跳加速

    (在数组的最后一个,因为这个数组可以进行排序的操作) 2.在最大的数的左区间内,使用双指针算法,快速统计处符合要求的三元组的个数 固定最大的数我们固定n次,时间复杂度是o(n) 双指针相向移动,时间复杂度是...,所以我们直接从最后一个数开始 //我们这里的i>=2,为什么呢?...3.代码分析 我们先对这个混乱的数组进行一个排序的操作,我们直接使用sort进行排序的操作 然后我们就可以利用双指针进行问题的解决操作 我们先计算数组元素个数 我们先使用这个外层for循环进行这个排序好的数组的最后一位的固定...然后我们利用双指针快速统计符合条件的三元组的个数 我们创建两个指针,然后左指针指向0,右指针指向i-1就是倒数第二个数开始 然后我嫩进行一个wile循环的操作 循环的条件就是left得小于right...return { }; } }; 3.4 代码分析 我们先定义了两个指针,left和right,让left指向我们的下标为0的元素,right指向我们的下标为n-1的元素

    28110

    一起来学matlab-matlab学习笔记5 低级文件输入输出函数

    “参考书籍 《matlab 程序设计与综合应用》张德丰等著 感谢张老师的书籍,让我领略到matlab的便捷 MATLABt提供了一组低级文件I/O函数,这些函数都是基于ANSI标准C库的I/O....如果输入流是字节,而且fread到达了文件结尾,但是一个元素需要的字节数才读了一半,这不足一个元素的部分数据将被忽略。然而,如果输入流是位,则不足一个元素的部分数据将被返回作为最后的值。 ?...写二进制数据 fwrite函数用指定的格式将矩阵的元素写到文件,并返回已写的元素数,其调用格式如下: ?...MATLAB利用文件指针确定下一个读或写操作开始的地方法。如何知道文件指针是否在文件的结束(EOF)?如何将指针移动到指定位置?怎样得知当前文件指针在什么地方?怎样重置指针在文件开头(BOF)?...fgets函数只用于文本文件。 tline=fgets(file1D,nchar):从fileID指定的文件读一行文本,带有行结束符,返回的行最多有nchar个字符。

    1.9K30

    fscanf读取一行字符串-C语言文件流(字节流) IO 操作(二) —— 初识“流”以及文件的顺序读写(f

    按照处理的数据单位不同,可以分为字节流、字符流;按照数据流的方向不同,可以分为输入流(从外设读取信息)、输出流(向外设输出信息)。   2、 为什么会有“流”的概念?   ...当文件被关闭的时候,指针指向的位置会被重置。   (2) fputc 函数   fputc的作用是向流或者标准输出(屏幕)中输出一个字符。.../ fputs) (1) fgets 函数   fgets 的作用是从流或者标准输入(键盘)中获取多个字符。...fgets 的函数声明如下:   第一个参数:存储读取到的字符串   第二个参数:要读取的字符个数   第三个参数:任意输入流,文件流或者标准输入流(即文件指针或者stdin)   返回值:读取成功则返回读取到的字符串地址...你要写入到文件的内容,需要先存到这个数组里   第二个参数:数组一个元素所占字节大小   第三个参数:数组大小   第四个参数:文件流指针   返回值:返回实际写入的元素个数   注意:也可以写入一个变量或者一个自定义类型的对象

    1.9K30

    从“文件小白“到“IO大侠“:C语言文件操作全攻略

    前言 "为什么程序员的电脑里总有那么多文件? 因为他们深谙fopen()之道,却忘了fclose()之德…… 欢迎来到C语言文件操作的奇妙世界!...一、为什么使用文件 如果没有⽂件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运⾏程序,是看不到上次程序的数据的,如果要将数据进行持久化的保存,我们可以使用⽂件。...fgets函数的功能就是从指定位置读取指定字符个数的数据储存到指定位置。该函数调用成功会返回用于储存数据的位置的地址,如果读取过程中发生错误,或是读取到了文件末尾,则返回一个空指针(NULL)。...(相对于开头的字节数) 示例:记录当前位置 long pos = ftell(fp); // 获取当前位置 3) 重置指针 rewind() void rewind(FILE *stream); 作用...:将文件指针重置到开头(等价于fseek(fp, 0, SEEK_SET)) 2、 实战演示:修改文件中间内容 假设有一个日志文件log.txt,内容如下: [1] 启动成功 [2] 加载配置 [3]

    39510

    线性表--顺序队列 循环队列 双端队列(十三)

    进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队列。 2.队列的数据元素又称为队列元素。在队列中插入一个队列元素称为入队,从队列中删除一个队列元素称为出队。...与顺序栈相似,在队列的顺序存储结构种,用一组地址连续的存储单元依次存放从队头到队尾的元素,如一维数组。 ? 由于队列中的队头和队尾的位置是实时变化的,需要两个指针来随时跟随头尾队列。...,我来说一下: 上面定义的数组为50个单位,如果rear指针指向49,继续有数据入队,当rear指针+1变为49+1等于50,因为数组下标最大只有49,会造成数组越界并假溢出,此时便不应该是(rear...)49继续加1,而是应该将rear重置为0,才可解决问题,所以不采取取膜算法也是可以的,就是将最大的长度重置为0,而其他数和取不取模最后的结果是一样的,只是为了方便,一遍会采取取膜,(49+1)%=0,...而如果限定双端队列从某个端点插入的元素只能从该端点删除,则该双端队列就蜕变为两个栈底相邻的栈了。这种双端队列看起来比栈和队列更灵活,但是实际应用中远不及栈和队列常用,就不在讨论。

    94620

    【C语言】文件操作详解2(文件的顺序读写操作)

    * fgets ( char * str, int num, FILE * stream ); str指向字符数组的指针,用于存储读取的字符串 num表示最大读取字符个数 stream表示接收字符串的文件的文件指针...故实际只存储 num-1 个字符 二、fgets读取时遇到换行符时停止读取不管下一行还有多少字符 代码演示: 先在新建文件中写两行字符 这里我写的两行分别是(Hello)和(world)方便观察...size表示每个要输出元素的字节大小 count表示要输出多少个元素 stream表示接收数据的文件的文件指针 代码演示: (内有注释,不懂就看) 现在,我们定义一个结构体类型,再将结构体中的数据输出到文件中...* ptr, size_t size, size_t count, FILE * stream ); ptr为指向要输入的元素数组的指针 size表示每个要输入元素的字节大小 count表示要输入多少个元素...stream表示文件的文件指针 可翻译为: 从stream所指向的文件中读取count个大小为size个字节的数据,并存放在ptr指向的空间中 代码演示: 现在我运行代码读取之前fwrite

    16210

    C语言中的文件与文件操作入门

    其原型如下: int fclose(FILE *stream); stream 是要关闭的文件的文件指针。...示例: fclose(fp); 3. fgetc 和 fgets 函数 fgetc 函数用于从指定的文件中读取一个字符,而 fgets 函数用于从指定的文件中读取一行。...示例: fseek(fp, 10, SEEK_SET); // 将文件位置指针移动到文件的第10个字节处 ftell 函数的原型: long ftell(FILE *stream); 它返回当前文件位置指针的位置...示例: long pos = ftell(fp); // 获取当前文件位置指针的位置 rewind 函数则用于将文件位置指针重置到文件的开头。...void rewind(FILE *stream); 示例: rewind(fp); // 将文件位置指针重置到文件的开头 这些函数提供了对文件进行基本操作的能力,初学者可以通过这些函数学习并实践

    49900

    收集飞花令碎片——【C语言】文件操作

    一、什么是文件 文件是计算机中用于存储数据的基本单位,可以理解为存储在计算机外部存储器(如硬盘、U盘等)上的数据集合 二、为什么需要文件操作?...重要特性: fgets 会包含它读到的换行符 \n(如果读到了的话),并在字符串末尾自动添加一个空终止符 \0。 返回值: 成功时,返回 str 指针。...size: 要读取的每个元素的字节大小(例如 sizeof(int))。 nmemb: 要读取的元素个数。 stream: 要读取的输入流。...size: 要写入的每个元素的字节大小。 nmemb: 要写入的元素个数。 stream: 要写入的输出流。...进行一些其他读写操作 ... // 恢复到之前的位置 fseek(fp, current_pos, SEEK_SET); 6.6.3)rewind():重置文件位置 将文件位置指示器重置到文件开头 void

    16610

    文件读写(相关函数详解)

    =-1) { printf("%c", c); } fclose(pf); return 0; } 1.4 fgets函数 fgets参数如下: fgets函数的功能是把stream指向的文件中的...ptr指向的空间中的count个元素以二进制的形式写入stream所指向的文件中,其中参数size表示ptr指向的空间中的一个元素占的字节数,返回成功写入的元素个数 注意:文件要以"wb"的形式打开,表示以二进制形式写入...表示ptr指向的空间中的一个元素占的字节数,返回成功读取到的元素个数 注意:文件要以"rb"的形式打开,表示以二进制形式读取。...: 相关函数 fseek 根据⽂件指针的位置和偏移量来定位⽂件指针 ftell 返回⽂件指针相对于起始位置的偏移量 rewind 让⽂件指针的位置回到⽂件的起始位置...fgets如果读取正常,返回的是存储读取到的字符串的字符数组的地址,如果读取的过程中遇到文件末尾,或者发生错误,都返回NULL。 所以我们是无法知道是因为什么原因文件读取结束的。

    13910

    征服 C 语言文件 IO:透视数据流、FILE* 核心机制与高效实践全指南

    C语言文件操作核心概念——“文件流"的旅程 C语言的文件操作本质上是在管理一个从内存到外部存储设备(如磁盘)的"数据流”,以及管理这个流的"交通管制员"——文件指针。 1. 为什么要用文件?...文件操作(操作光标的位置) 顺序读写:就像读一本书,光标(文件指针)从头开始,每读一个字节或一个数据,就往后移动一位。fgetc/fputc、fgets/fputs 都是顺序操作。...,不然有可能你上次写的那些字符丢失掉,我已经踩过坑了。...先来看结果,很明显文件里面是有部分内容长度超出了我的数组长度,但结果还是正确打印在了屏幕上: 这是为什么呢,确实内容很长,但你每次只读五个放在数组里,打印也是打印读入的字符串,就相当于你把文件里面的内容...7.2.3 rewind rewind 是一个快速将文件指针重置到文件开头的函数。 属性 描述 功能 让文件指针的位置回到文件的起始位置(即偏移量 0)。

    18810

    C语言 —— 指尖跃迁 刻印永恒 - 文件操作

    : FILE* ,通常称为文件指针 C语言中,就是通过 FILE* 的文件指针来维护流的各种操作的 3.2 文件指针 文件类型指针简称件指针 每个被使用的文件都在内存中开辟了一个相应的文件信息区...,防止野指针 return 0; 4.2 fgets和fputs fgets fgets文档链接: fgets - C++ Reference https://legacy.cplusplus.com...如若该行(包括最后一个换行符)的字符数超过n-1,则fgets只返回一个不完整的行 返回值: 1. 如果成功,该函数返回str的头指针 2....count个size字节的数据到输出流stream中,该函数以二进制形式对文件进行操作,不局限于文本文件 返回值: 如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型...fseek(pa, 5, SEEK_SET); int a = ftell(pa); printf("重置之前偏移量为%d\n", a); rewind(pa);//把文件指针重置到文件起始位置

    64410
    领券