一、题目描述
题目链接
购物车内的商品价格按照升序记录于数组 price
。请在购物车中找到两个商品的价格总和刚好是 target
。若存在多种情况,返回任一结果即可。
示例 1:
输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3]
示例 2:
输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27]
二、题目解析
注意题目中的关键字——有序数组,但我们遇见有序的情况,一定要优先考虑两种算法:
二分和双指针
但是能用双指针,我们优先使用双指针,因为只要能用双指针的算法一般都是最优的,该算法能使时间复杂度降维!
双指针思想:
定义左右两个指针,分情况讨论,循环遍历数组一遍,即可找出答案。
三、原码
int* twoSum(int* price, int priceSize, int target, int* returnSize) {
//有序,运用双指针的算法解决
*returnSize = 2;
int left = 0;
int right = priceSize - 1;
while(left < right)
{
if((price[left] + price[right]) == target)
{
int* arr = (int*)malloc(sizeof(int) * (*returnSize));
arr[0] = price[left];
arr[1] = price[right];
return arr;
}
else if(price[left] + price[right] > target)
right--;
else
left++;
}
return NULL;
}