题源:
描述
输入一个升序数组 array 和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,返回任意一组即可,如果无法找出这样的数字,返回一个空数组即可。
数据范围: 0≤len(array)≤105 , 1≤array[i]≤106
示例1
输入:
[1,2,4,7,11,15],15
返回值:
[4,11]
说明:
返回[4,11]或者[11,4]都是可以的
示例2
输入:
[1,5,11],10
返回值:
[]
说明:
不存在,返回空数组
示例3
输入:
[1,2,3,4],5
返回值:
[1,4]
说明:
返回[1,4],[4,1],[2,3],[3,2]都是可以的
示例4
输入:
[1,2,2,4],4
返回值:
[2,2]
思路:
双指针,二分查找,这种方法甚至不用开辟新的空间来pushback数组,比较省空间,然后遍历寻找即可,返回两个数;另注意此题不要使用暴力,容易超时。
题解:
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array, int sum) {
//定义双指针,二分寻找
int left = 0, right = array.size() - 1;
while (left < right) {
if (array[left] + array[right] == sum)
return {array[left],array[right]};
else if (array[left] + array[right] > sum)
right--;
else
left++;
}
return {};
}
};