代码:
class Solution {
public int[] twoSum(int[] price, int target) {
int length=price.length;
int left=0;
int right=length-1;
while (left<right){
if(price[left]+price[right]>target){
right--;
}else if(price[left]+price[right]<target){
left++;
}else {
break;
}
}
return new int[]{price[left],price[right]};
}
}
题解:
题目中给出了很关键的信息就是,购物车内的商品价格按照升序记录于数组 price
我们可以利用有序数组的单调性和双指针来解决该问题,通过示例2 给出的数据 8, 21, 27, 34, 52, 66 进行讲解
首先让 L 指针指向下标为 0 的数,这是数组中最小的数,让 R 指针指向下标为 price.length - 1 的数,这是数组中最大的数,计算 8+66 =74 > 61,此时 L 指针指向的已经是最小的数了,所以要让 R- - ,淘汰 66
8 21 27 34 52 66 target=61
L R
R- - 以后指向 52,此时 8+52 = 60 < 61 ,此时 R 指针指向的已经是最大的数了,所以要让 L+ +,淘汰 8
8 21 27 34 52 66 target=61
L R
一直循环上述的操作,直到 price[ L ] + price[ R ] = target 为止
8 21 27 34 52 66 target=61
L R