57-01 和为s的两个数字

题目

输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和为s。如果有多对和为s,输入任意一对即可。

牛客网 OJ
AcWing OJ

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 []
posted @ 2019-03-17 14:57  youngliu91  阅读(140)  评论(0编辑  收藏  举报