剑指offer 和为S的两个数字
问题描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
C++代码实现
思路:1、map
2、双指针
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int temp = INT_MAX;
pair<int, int> ret;
map<int, int> mp;
for (int i = 0; i < array.size(); i++)
{
mp[array[i]] = i;
}
for (int i = 0; i < array.size(); i++)
{
if (mp.find(sum - array[i]) != mp.end())
{
int j = mp[sum - array[i]];
if (array[i] * array[j] < temp && i < j)
{
temp = array[i] * array[j];
ret = {i, j};
}
}
}
if (ret.first == ret.second)
{
return vector<int>();
}
return vector<int>({array[ret.first], array[ret.second]});
}
};
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int temp = INT_MAX;
pair<int, int> ret;
int i = 0, j = array.size();
while (i < j)
{
if (array[i] + array[j - 1] == sum)
{
if (array[i] * array[j - 1] < temp)
{
temp = array[i] * array[j - 1];
ret = {i, j-1};
}
i++;
j--;
}
else if (array[i] + array[j - 1] < sum)
{
i++;
}
else
{
j--;
}
}
if (ret.first == ret.second)
{
return vector<int>();
}
return vector<int>({array[ret.first], array[ret.second]});
}
};
python2代码实现
# -*- coding:utf-8 -*-
class Solution:
def FindNumbersWithSum(self, array, tsum):
# write code here
temp = 10000
i = 0
j = len(array)
ret = []
while i < j:
if array[i] + array[j - 1] == tsum:
if array[i] * array[j - 1] < temp:
temp = array[i] * array[j - 1]
ret = [i , j - 1]
i += 1
j -= 1
elif array[i] + array[j - 1] < tsum:
i += 1
else:
j -= 1
if ret == []:
return []
return [array[ret[0]], array[ret[1]]]