题目描述1 和为S的数字
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路:两个指针指向收尾,对于一个递增数组而言,乘积最小和为S的理想情况是左侧保持最小,
对于两个指针位置的数之和 大于S则将尾左移,小于S则将首右移
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> result; if(array.empty()) return result; vector<int>::iterator start,end; for(start=array.begin(),end = array.end()-1;start<end;){ int cursum = *start + *end; if(cursum>sum) end--; else if(cursum==sum) { result.push_back(*start); result.push_back(*end); break; } else if(cursum<sum) start++; } return result; } };
题目描述2 和为S的连续正数序列
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路: 一定是增1的连续序列 且其中包含的数字个数大于等于2
可以参考两个指针一个指向头一个指向尾 同时设置头上的数不超过 (1+sum)/2来规避个数为1的情况
当总和>sum 时 左侧下标增加
< 右侧 增加
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>>result; result.clear(); vector<int> res; res.clear(); if(sum<=1) return result; int small=1,big=2; res.push_back(small); res.push_back(big); int mid = (sum+1)/2; int total=small + big; while(small<mid){ if(total<sum) { res.push_back(++big); total += big; } else if(total >= sum){ if(total==sum) result.push_back(res); res.erase(res.begin()); total -= small; small++; } } return result; } };