题解 | #和为S的两个数字#
和为S的两个数字
http://www.nowcoder.com/practice/390da4f7a00f44bea7c2f3d19491311b
条件:数组非递减排序(测试案例中并非只有题目中所说的非递增排序)
思路:首先,若给定数组为空,则返回空
其次,先找到数组中数值接近目标值一半的元素下标,以此为中心向两边拓展查找范围,找出所有可能
最后,由于结果数组中元素应该是两两为一对,因此计算所有可能解得乘积,再找出乘积最小值并记录位置,然后反推出答案数组中的所对应的实际元素。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
if(array.empty()) return vector<int> ();
vector<int> ans;
int i=0, temp=0;
while(temp==0)
{
if((array[i]<=sum/2) && (array[i+1]>=sum/2))
temp = i;
i++;
}
int first = temp;
int last = temp+1;
while(first>=0 && last<array.size())
{
if((array[first]+array[last]) > sum)
--first;
else if((array[first]+array[last]) < sum)
last++;
else
{
ans.push_back(array[first]);
ans.push_back(array[last]);
first--;
}
}
if(first<-1 || last>array.size() || ans.empty())
return {};
if(ans.size()==2)
return ans;
else
{
vector<int> mul;
for(int i=0;i<ans.size()/2;i++)
mul.push_back(ans[2*i]*ans[2*i+1]);
int cnt=0;
int num=mul[0];
for(int j=1;j<mul.size();j++)
{
if(num>mul[j])
{
num=mul[j];
cnt=j;
}
}
vector<int> comp;
comp.push_back(ans[2*cnt]);
comp.push_back(ans[2*cnt+1]);
return comp;
}
}
};时间复杂度:O(n)
空间复杂度:O(n)

