Leetcode刷题之经典双指针问题
创始人
2025-05-31 20:35:34

        光是话不行,要紧的是做。                           ——鲁迅

目录

 

一.什么是双指针问题?

二.最接近的三数之和

第一种暴力法:

第二种双指针: 

三.移除元素

第一种暴力法:

第二种双指针: 

四.盛最多水的容器 

一.什么是双指针问题?

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

换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。


第一种快慢指针:

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

第二种对撞指针:

对撞指针是指在数组中,将指向最左侧的索引定义为左指针(left),最右侧的定义为右指针(right),然后从两头向中间进行数组遍历。


对撞数组适用于连续数组和字符串,也就是说当你遇到题目给定连续数组和字符床时,应该第一时间想到用对撞指针解题。

二.最接近的三数之和

给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。

返回这三个数的和。

假定每组输入只存在恰好一个解。

示例 1:

输入:nums = [-1,2,1,-4], target = 1
输出:2
解释:与 target 最接近的和是 2 (-1 + 2 + 1 = 2) 。


示例 2:

输入:nums = [0,0,0], target = 1
输出:0

做题链接:最接近的三数之和

第一种暴力法:

求最接近的三数之和,使用三个循环依次遍历整个数组,枚举出所有的可能,从而推算出最接近的,但是此算法时间复杂度为O(N^3)。力扣上是运行不过的,这里我们只是作为一个参考。 

#include
#include
int threeSumClosest(int* nums, int numsSize, int target)
{int i = 0;int j = 0;int k = 0;int temp = nums[0] + nums[1] + nums[2];for (i = 0; i < numsSize; i++){for (j = i + 1; j < numsSize; j++){for (k = j + 1; k < numsSize; k++){int sum = nums[i] + nums[j] + nums[k];if (abs(sum- target) < abs(temp - target))//abs是绝对值的意思{//如果sum- target的绝对值更小,说明sum更接近target的值temp = sum;}}}}return temp;
}
int main()
{int nums[10] = { 0 };int numsSize = 0;int target = 0;scanf("%d %d", &numsSize, &target);int i = 0;for (i = 0; i < numsSize; i++){scanf("%d", &nums[i]);}int ret = threeSumClosest(nums, numsSize, target);printf("%d", ret);return 0;
}

第二种双指针: 

此算法需要先把数组从小到大进行排序,排好序之后。因为这里是三个数,而双指针操作的是两个数,这里我们就需要先定下一个数,然后左指针指向定的下一个数,右指针指向最右边的数。

int cmp_int(const void* a, const void* b)
{return *(int*)a - *(int*)b;
}
int threeSumClosest(int* nums, int numsSize, int target) {qsort(nums, numsSize, sizeof(int), cmp_int);//使用快排进行排序int best = nums[0] + nums[1] + nums[2];for (int i = 0; i < numsSize; i++){int left = i + 1;int right = numsSize - 1;while (left < right){int min = nums[i] + nums[left] + nums[left + 1];//先来算出最小值,如果target比最小值还小,后面代码就不用进行了,直接breakif (target < min){if (abs(min - target) < abs(best - target)){best = min;}break;}int max = nums[i] + nums[right] + nums[right - 1];//如果target比最大值还大,直接breakif (target > max){if (abs(max - target) < abs(best - target)){best = max;}break;}int sum = nums[i] + nums[left] + nums[right];if (sum == target)//有可能会出现相等的情况,相等了就直接返回{return target;}if (abs(sum - target) < abs(best - target)){best = sum;}if (sum > target){right--;}else{left++;}}}return best;
}

三.移除元素

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

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

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

示例 1:

输入:nums = [3,2,2,3], val = 3
输出:2, nums = [2,2]
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。


示例 2:

输入:nums = [0,1,2,2,3,0,4,2], val = 2
输出:5, nums = [0,1,4,0,3]
解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。

做题链接:移除元素

第一种暴力法:

遍历数组,如果在数组中找到了val,则把数组后面的内容全部向前移动一位,把val给覆盖掉,依次类推,直到把数组里面等于val的值全部给覆盖掉。

最坏的情况就是数组里面的值全是val,则时间复杂度为O(N^2)。

int removeElement(int* nums, int numsSize, int val)
{int i = 0;int j = 0;int count = 0;for (i = 0; i < numsSize; i++){if (nums[i] == val){for (j = i; j < numsSize-1; j++){nums[j] = nums[j + 1];}i--;//使下一次判断时,回到上次判断的位置numsSize--;//进入一次if语句,则数组的大小就会减少一个}}return numsSize;
}
int main()
{int nums[10] = { 0 };int numsSize = 0;int val = 0;scanf("%d %d", &numsSize, &val);int i = 0;for (i = 0; i < numsSize; i++){scanf("%d", &nums[i]);}int ret = removeElement(nums, numsSize,val);int j = 0;for (j = 0; j < ret; j++){printf("%d ", nums[j]);}return 0;
}

第二种双指针: 

int removeElement(int* nums, int numsSize, int val)
{int dst=0;int src=0;while(dst

四.盛最多水的容器 

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

说明:你不能倾斜容器。

 

示例1:

输入:[1,8,6,2,5,4,8,3,7]
输出:49 
解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为7*7= 49。


示例 2:

输入:height = [1,1]
输出:1

做题链接:盛最多水的容器

这道题还是使用双指针的方法来求:

int max(int x, int y)
{return x > y ? x : y;
}
int min(int x, int y)
{return x < y ? x : y;
}
int maxArea(int* height, int heightSize)
{int left = 0;int right = heightSize - 1;int maxarea = 0;while (left < right){maxarea = max(maxarea, min(height[left], height[right]) * (right - left));//min是求装水的最大高度,肯定以最低的那条线为准,不然就漏水了//right-left就是底边的长if (height[left] > height[right])//说明height[right]此时是短的那根线,需要right--,往前找其他的线right--;elseleft++;}return maxarea;
}

你的点赞,评论,收藏加关注都是我前进的动力。感谢!

相关内容

热门资讯

最新!2025新势力5月销量出... 5月新势力表现如何?2025年5月的销售周期刚刚过去,不少造车新势力厂商的销量数据,已经新鲜出炉。数...
两家A股公司,收终止上市决定 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。 上述自律监管决定书指出,因2...
重磅,事关教育强国,主力提前埋... 数据是个宝数据宝投资少烦恼这些产业的景气度处于上升期。《求是》杂志发表文章《加快建设教育强国》6月1...
阳光诺和“二刷”收购 80后富... 《投资者网》蔡俊时隔2年后,阳光诺和(688621.SH,下称“公司”)再拟收购同一个资产。实际上,...
买车,不安全了? 买车,不安全... 在新能源汽车市场竞争空前激烈的当下,车企、经销商习惯于采取更加激进的营销、市场策略,尤其在行业加速“...
欧佩克+同意7月再增产41.1... 为了增产惩罚超产国并争夺市场份额,欧佩克+连续第三个月大幅增产,美国页岩油生产商或首当其冲,美油一度...
经济学泰斗菲舍尔逝世:培育伯南... 当地时间6月1日,以色列央行发布声明称,世界著名经济学家、以色列央行前行长及美联储前副主席菲舍尔(S...
更名!“天府证券”来了 天府证... 【导读】宏信证券更名为天府证券中国基金报记者 吴君这家券商,历史上第二次更名。5月末,工商信息显示,...
两家A股公司,收终止上市决定 ... 又有两家A股上市公司收到股票终止上市决定,6月10日进入退市整理期。*ST鹏博(600804)公告称...
瑞幸降价迈入“6块9”时代?瑞... 说起最近几年的咖啡茶饮市场,相信每个人都不会陌生,各家咖啡茶饮企业的各种降价消息是此起彼伏,就在最近...
主次节奏:6.1黄金 - 每周... 本文每周初更新发布梳理各级别走势分析和预期主次节奏:做有品质的三方服务黄金月线图(超长线) 月线图...
超400亿资金狂涌!这类ETF... 债券ETF市场持续扩容。今年以来,债券市场表现震荡,债券类基金回报远不及预期,但这并未妨碍债券型ET...
坚定信心 行稳致远(记者手记) 侯琳良 最近一段时间,海尔集团上世纪90年代投资制作的《海尔兄弟》动画片,在多个视频平台上线高清重制...
世纪大辩论2——哈耶克与凯恩斯... 本来节后决定启动一个项目,但家里临时有事,需要陪家人去一趟北京,节后拉群的事,因此要推迟一周左右(具...
4月广州消费品市场表现强劲 1-4月,随着消费品以旧换新等促消费政策持续发力和各类会展活动陆续开展,政策相关消费快速增长,升级类...
金价,又跌了! 人民财讯5月31日电,5月30日,COMEX黄金期货收跌0.92%,报3313.1美元/盎司。 从高...
10万吨改性项目!巴斯夫、金发... 【DT新材料】获悉,6月3日,沪市主板新股海阳科技将启动申购,上市在即! 资料显示,海阳科技前身为南...
湾财周报|大事记 比亚迪驳斥“... 一周大事记(5月26日-6月1日) 头条 比亚迪驳斥! 长城“车圈恒大论”是行业警示还是危言耸听?...
通源石油跌1.96%,成交额1... 5月30日,通源石油跌1.96%,成交额1.03亿元,换手率4.40%,总市值23.54亿元。 异动...
中国邮储银行浙江分行2025校... 点这里 ↑ 老满说高考 作者 l 老满 生涯规划师l 升学顾问l 拆书家 这是 老满说高考公众号 的...
公募基金规模首次突破33万亿元... 每经记者:肖芮冬 每经编辑:叶峰 天赐良基日报第654期 一、今日基金新闻速览 1、华润元大基金贾...
湾财周报 大事记 比亚迪驳斥“... 一周大事记(5月26日-6月1日)头条比亚迪驳斥!长城“车圈恒大论”是行业警示还是危言耸听?近日,关...
EL表达式JSTL标签库 EL表达式     EL:Expression Language 表达式语言     ...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
工信部、中汽协紧急发声!汽车“... 文/刘育英新一轮汽车价格战再起。近日,工信部、中汽协纷纷发声表示反对。工业和信息化部表示,将加大对汽...
3 ROS1通讯编程提高(1) 3 ROS1通讯编程提高3.1 使用VS Code编译ROS13.1.1 VS Code的安装和配置...
募资39亿,全亏光了,账上不到... 关于天然气,用户的感觉是价格一直在上涨,但很奇怪,不管怎么涨,天然气企业仍然亏,还亏得一塌糊涂。这是...
资阳房产评估公司 这是(tel-15828298733)整理的信息,希望能帮助到大家 在当今社会,随着经济的发展和城...
华桥汇利(中国)投资基金管理有... 今年第一季度,美国企业利润出现大幅下降,且面临着来自关税上升的持续压力,这一局面可能会在今年进一步加...
ESG 报告合规与鉴证:全球政... 在当下全球经济格局里,ESG(环境、社会和公司治理)已然成为衡量企业可持续发展能力的关键指标。随着全...