题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
分析:段错误:您的程序发生段错误,可能是数组越界,堆栈溢出(比如,递归调用层数太多)等情况引起
急死我了,原来是::
没有考虑异常输入!!!如果给的数组为空,那么你访问,必然就是上个原因了。
异常输入:
如果输入为空数组,你访问某个值,就是非法访问数组。
一直都在提醒:
检查指针是否为空,数组为空,特殊输入测试,不然自己都不知道怎么死的。
此题有个技巧:
1*19<2*18<3*17<.....<10*10 所以第一对就是乘积最小的。
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> res;
if(array.size()<2) return res;//没有这句话,老是说我非法访问数组,老子要急死了。
int begin=0,end=array.size()-1;
long long minproduct=INT_MAX;
int final_begin=begin,final_end=end;
while(begin<end){
int tmpsum=array[begin]+array[end];
if(tmpsum>sum)
end--;
else if(tmpsum<sum)
begin++;
else{
if(array[begin]*array[end]<minproduct){
minproduct=array[begin]*array[end];
final_begin=begin;final_end=end;
}
begin++;
end--;
}
}
if(array[final_begin]+array[final_end]!=sum)
return res;
else{
res.push_back(array[final_begin]);
res.push_back(array[final_end]);
}
return res;
}
};
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
int begin=0,end=array.size()-1;
int minproduct=INT_MAX;
int final_begin=begin,final_end=end;
vector<int> res;
while(begin<end){
int tmpsum=array[begin]+array[end];
if(tmpsum>sum)
end--;
else if(tmpsum<sum)
begin++;
else{
res.push_back(array[begin]);
res.push_back(array[end]);
break;
}
}
return res;
}
};