专题一双指针

专题一双指针

1.移动0

数组分块

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意 ,必须在不复制数组的情况下 原地 对数组进行操作。

cur扫描数组。

dest分界扫描过的前非0元素与后0元素。

分割形成的原理:

cur :

遇0cur++

非0des++ 交换 cur++

拓展来看:

区域数据的划分。

2.双0复写

从后写入

给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

注意:请不要在超过 该数组长度的位置写入元素。请对输入的数组 就地进行上述修改,不要从函数返回任何东西。

1.cur扫描 实现dest、cur的定位

cur = 0,dest = -1;

cur\]非零 dest++ 若dest\>=size-1**break** ; cur++; \[cur\]为零 dest+=2 若dest\>=size-1**break** ; cur++; ### 2.特殊情况处理(des越界) ![](https://i-blog.csdnimg.cn/direct/e4f38ce354544cf0a42502a706c14c6f.png) \[size-1\] = 0; cur--; dest -= 2; 为什么会有特殊情况? 第二步的逻辑假设与第一步的**dest+=2**相关联。 ### 3.从后往前复写 cur至最后一个要写的数 dest从后往前: \[cur\]为0 \[dest\]为0 dest-- \[dest\]为0 dest-- cur-- \[cur\]非零 交换 dest-- cur-- ### 反思: 下标+=2就可能越界像指针-\>next-\>next一样 可能在**中途**出现空指针。 ## [3.数组元素循环判断 快乐数](https://leetcode.cn/problems/happy-number/description/ "3.数组元素循环判断 快乐数") ### 尾循环 编写一个算法来判断一个数 `n` 是不是快乐数。 **「快乐数」** 定义为: * 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 * 然后重复这个过程直到这个数变为 1,也可能是 **无限循环** 但始终变不到 1。 * 如果这个过程 **结果为** 1,那么这个数就是快乐数。 如果 `n` 是 *快乐数* 就返回 `true` ;不是,则返回 `false` 。 ![](https://i-blog.csdnimg.cn/direct/de95fb7853634e9781026a7ede19613e.png) 快慢指针体现于 每次取各个位的平方和的次数若n == 19 那么s = 1\^2 + 9\^2 == 82; f = 8\^2 + 2\^2; 此后f按照自身数来进行"两步" s按照自身数来进行"一步"。 ↓ //为什么不能按照s来呢? 答案:f的相对位移逐增。 题眼:**"1"的循环看待** 快慢指针的定义 ## [4.数组水桶问题](https://leetcode.cn/problems/container-with-most-water/description/ "4.数组水桶问题") 给定一个长度为 `n` 的整数数组 `height` 。有 `n` 条垂线,第 `i` 条线的两个端点是 `(i, 0)` 和 `(i, height[i])` 。 找出其中的两条线,使得它们与 `x` 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 **说明:**你不能倾斜容器。 ![](https://i-blog.csdnimg.cn/direct/c42f9ce09d184a749787d841fca44bef.jpeg) 左右聚拢的依据:(本质为**单调性**的使用) ![](https://i-blog.csdnimg.cn/direct/4ba1d74bf01d4392b98759375eb1598b.png) 双指针向内聚拢 更新最大值。 ## [5.有效三角形个数](https://leetcode.cn/problems/valid-triangle-number/description/ "5.有效三角形个数") 使用sort快排减少三角形决断次数 若:a \<= b \<= c 那么满足a+b\>c即可! ![](https://i-blog.csdnimg.cn/direct/2293fc26681c481cbf8f7e6b4f5c8dc4.png) cur\>=2 l \< r ①a + b \> c sum += right - left;,right-- //中间部分全大于 ②a + b \<= c left++; //left向中间聚拢找可能存在的 反思:主要利用**单调性**来简化三角形次数的判断 ## 练习 要求:打草画清晰图 结构化 了解双指针的内涵 [递增数组元素 查找 定和值](https://leetcode.cn/problems/he-wei-sde-liang-ge-shu-zi-lcof/ "递增数组元素 查找 定和值") 购物车内的商品价格按照升序记录于数组 `price`。请在购物车中找到两个商品的价格总和刚好是 `target`。若存在多种情况,返回任一结果即可。 **示例 1:** ``` 输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3] ``` **示例 2:** ``` 输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27] ``` ## [6.三数和](https://leetcode.cn/problems/3sum/submissions/712080565/ "6.三数和") 前言:基于两数和进行。 给你一个整数数组 `nums` ,判断是否存在三元组 `[nums[i], nums[j], nums[k]]` 满足 `i != j`、`i != k` 且 `j != k` ,同时还满足 `nums[i] + nums[j] + nums[k] == 0` 。请你返回所有和为 `0` 且不重复的三元组。 **注意:**答案中不可以包含重复的三元组。 ![](https://i-blog.csdnimg.cn/direct/83a92c4c7eb643d1957467737958e280.png) 固定 i 在i的左侧利用双指针来寻找与-nums\[i\]相等的和值 。 去重:内部去重 外部去重

相关推荐
Via_Neo3 小时前
二进制枚举
数据结构·算法·leetcode
瑶总迷弟3 小时前
Python入门第6章:字典(键值对数据结构)
java·数据结构·python
春栀怡铃声4 小时前
常考排序的梳理
数据结构·算法·排序算法
第二只羽毛4 小时前
第六章 图
大数据·数据结构·算法·深度优先·图论·广度优先·宽度优先
吕司5 小时前
LeetCode Hot Code —— 和为K的子数组
数据结构·算法·leetcode
承渊政道5 小时前
【优选算法】(实战剖析链表核心操作技巧)
开发语言·数据结构·c++·vscode·学习·算法·链表
浅念-6 小时前
Linux 进程与操作系统
linux·运维·服务器·网络·数据结构·笔记·网络协议
计算机安禾6 小时前
【数据结构与算法】第20篇:二叉树的链式存储与四种遍历(前序、中序、后序、层序)
c语言·开发语言·数据结构·c++·学习·算法·visual studio
会编程的土豆6 小时前
【数据结构与算法】二叉树遍历 集合
数据结构·算法