题目描述
输入一个递增排序的数组和一个数字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; } };