算法题(31):两数之和-输入有序数组
审题:
在确定有唯一解的前提下,找出两个下标对应的元素值之和等于target的下标,并存入数组中返回
思路:
方法一:暴力搜索(超时)
利用两个循环进行所有情况的枚举,让每个元素依次与其他元素进行匹配,把所有情况都遍历一遍
方法二:双指针
让left指向索引为0处,right指向索引为n-1处。计算这两个位置的元素的和
如果等于target就退出循环
小于target,则让left++,因为越往右边走,值越大,left++之后sum就变大了,可以接着与target比较
大于target,则让right--
解题:
思考:双指针解法的本质是缩小范围查找,那么我们有没有可能遗漏答案?
这里的遗漏答案指的不是没有找到第二个答案,因为题目说了只有唯一解,这里指的是会不会找不到唯一解
其实不会遗漏唯一解
根据题目:我们假设唯一解的左指针指向为i,右指针指向为j
有: 0 <= i <= j <= n-1
假设会遗漏唯一解,分两种情况
(1)left>i
(2)right<j
但是这两种情况都不可能存在
(1)left和right不可能同时到达i或j,除非i==0,j==n-1,但是这种情况直接就返回了,不会遗漏。
(2)left先到达i:此时right>j,说明sum>target.此时left不会右移,而是right左移,直到right到达j。即left不会大于i
(3)right先到达j:此时left<i,说明sum<target.此时right不会左移,而是left右移,直到left到达i。即right不会小于j
故不会遗漏唯一解。
167. 两数之和 II - 输入有序数组 - 力扣(LeetCode)