数组--对撞指针

例题:两数之和

给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。

函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。

说明:

返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。

思路:由于数组是升序排列的,所以利用对撞指针,i从左向右,j从右向左。假如nums[i]+nums[j]

  • ==target,说明找到了
  • <target,则i++,让和增大
  • >target,则j–,让和减小

这样一直遍历直到i=j仍然没有找到,说明没有这么两个数。

1.验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

这个题思路很简单,但是需要注意很多细节。我在实现的时候使用ASCII码来对比大小写字母,只要差32或者相同就算他们相等。但是! 0和P也差32,所以就会出错,需要用别的,但是对撞指针这个思路是没错的,所以为了节省时间就不做了。

2.反转字符串

比验证回文串还简单,也是用对撞指针,就不写了。

3. 反转字符串中的元音字母

一个样

4.盛最多水的容器

给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

说明:你不能倾斜容器,且 n 的值至少为 2。

在这里插入图片描述
这个题当初可真是难住我了,即使是现在,不告诉我这是一道对撞指针题,我也是做不出来。用了对撞指针就简单了。ij之间便是容器,每次要想使容积增大。则必须要移动一边。由于短板理论,所以

  • 如果移动了长边,那么只能是更少;
  • 如果移动短边,要么会增大,要么会减少,要么不变。

所以,每次向里移动短边,然后记录容积,比较最大值,直到对撞指针相遇。此时返回容积值即可。

发布了60 篇原创文章 · 获赞 6 · 访问量 1216

猜你喜欢

转载自blog.csdn.net/DLC990319/article/details/104965728