例题:两数之和
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。
函数应该返回这两个下标值 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。
这个题当初可真是难住我了,即使是现在,不告诉我这是一道对撞指针题,我也是做不出来。用了对撞指针就简单了。i
与j
之间便是容器,每次要想使容积增大。则必须要移动一边。由于短板理论,所以
- 如果移动了长边,那么只能是更少;
- 如果移动短边,要么会增大,要么会减少,要么不变。
所以,每次向里移动短边,然后记录容积,比较最大值,直到对撞指针相遇。此时返回容积值即可。