【剑指offer-解题系列(42)】和为S的连续正数序列
2017-05-30 11:10
399 查看
[b]输出描述:[/b]
对应每个测试案例,输出两个数,小的先输出
分析
采用二分搜索得到一个数位置,然后可以通过大小判断另一个数字的位置,只需要查找另一半就行。
代码实现
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int>res;
if(array.size()<=0)
return res;
int mul = INT_MAX;
int last_a;
int last_b;
int count=0;
for(auto it = array.begin();it!=array.end();it++){
int a =*it;
int b =sum-a;
if(-1!= upper( array , b , 0, array.size())){
count++;
if(a*b<mul){
mul=a*b;
last_a=a;
last_b=b;
}
}
}
if(count>0){
res.push_back(last_a);
res.push_back(last_b);
}
return res;
}
int upper(vector<int> &data ,int k, int start, int end){
if(start == end ){
if(data[end] == k)return end;
else return -1;
}
int mid = (start + end)/2;
if( data[mid] > k )return upper( data , k , start, mid);
if( data[mid] < k )return upper( data , k , mid+1, end);
if( data[mid] == k ){
if( mid<end&&data[mid+1]!=k )
return mid;
else
return upper( data , k , mid+1, end);
}
return -1;
}
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。[b]输出描述:[/b]
对应每个测试案例,输出两个数,小的先输出
分析
采用二分搜索得到一个数位置,然后可以通过大小判断另一个数字的位置,只需要查找另一半就行。
代码实现
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int>res;
if(array.size()<=0)
return res;
int mul = INT_MAX;
int last_a;
int last_b;
int count=0;
for(auto it = array.begin();it!=array.end();it++){
int a =*it;
int b =sum-a;
if(-1!= upper( array , b , 0, array.size())){
count++;
if(a*b<mul){
mul=a*b;
last_a=a;
last_b=b;
}
}
}
if(count>0){
res.push_back(last_a);
res.push_back(last_b);
}
return res;
}
int upper(vector<int> &data ,int k, int start, int end){
if(start == end ){
if(data[end] == k)return end;
else return -1;
}
int mid = (start + end)/2;
if( data[mid] > k )return upper( data , k , start, mid);
if( data[mid] < k )return upper( data , k , mid+1, end);
if( data[mid] == k ){
if( mid<end&&data[mid+1]!=k )
return mid;
else
return upper( data , k , mid+1, end);
}
return -1;
}
相关文章推荐
- 剑指Offer——(42)和为S的连续正数序列
- 剑指Offer面试题41和为s的两个数字与和为s的连续正数序列,面试题42翻转单词顺序与左旋转字符串
- [剑指offer]和为S的连续正数序列
- 剑指offer 42 和为S的连续正整数序列
- 剑指Offer——和为S的连续正数序列
- 剑指Offer40 和为s的连续正数序列
- 剑指offer面试题[41]-和为s的两个数VS和为s的连续正数序列
- 剑指offer-和为s的两个数字VS和为s的连续正数序列
- 剑指offer----和为S的连续正数序列----java实现
- 剑指offer 41题【知识迁移能力】和为S的连续正数序列
- 剑指offer 和为s的连续正数序列
- 剑指offer-面试题41-和为s的两个数字VS和为s的连续正数序列
- 剑指offer-和为S的连续正数序列
- 剑指offer题解 和为S的连续正数序列
- 【剑指Offer面试编程题】题目1354:和为S的连续正数序列--九度OJ
- 【剑指offer-解题系列(21)】栈的压入、弹出序列
- 剑指offer-和为S的连续正数序列
- 剑指Offer----面试题41(2):和为s的连续正数序列
- 剑指offer之和为S的连续正数序列
- 剑指offer 和为S的连续正数序列