57-01 和为s的两个数字
题目
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和为s。如果有多对和为s,输入任意一对即可。
C 语言题解
数列满足递增,设两个头尾两个指针i和j,
- 若ai + aj == sum,就是答案
- 若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),j -= 1
- 若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),i += 1
bool FindNumbersWithSum(int data[], int length, int sum,
int* num1, int* num2)
{
bool found = false;
if (length < 1 || num1 == nullptr || num2 == nullptr)
return found;
// 最末尾的位置
int ahead = length - 1;
// 最开始的位置
int behind = 0;
while (ahead > behind)
{
long long curSum = data[ahead] + data[behind];
if (curSum == sum)
{
*num1 = data[behind];
*num2 = data[ahead];
found = true;
break;
}
else if (curSum > sum)
ahead--;
else
behind++;
}
return found;
}
C++ 题解
class Solution {
public:
vector<int> FindNumbersWithSum(const vector<int>& a,int sum) {
vector<int> res;
int n = a.size();
int i = 0, j = n - 1;
while(i < j){
if(a[i] + a[j] == sum)
{
res.push_back(a[i]);
res.push_back(a[j]);
break;
}
while(i < j && a[i] + a[j] > sum)
--j;
while(i < j && a[i] + a[j] < sum)
++i;
}
return res;
}
};
python 题解
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
# write code here
if len(array)<2:
return []
found=False
fst,lst=0,len(array)-1
while fst<lst:
sum_total=array[fst]+array[lst]
if sum_total==tsum:
found=True
return [array[fst],array[lst]]
elif sum_total<tsum:
fst +=1
else:
lst -=1
return []