和为s的两个数字
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。
输入:{1,2,4,7,11,15}
输出:4 11
思路:1、利用两个指针,1个指针指向第一个数字,另一个指针指向最后一个数字
2、如果前者+后者>s,那么后一个指针往前面走
3、如果前者+后者 < s,那么前一个指针往后面走
4、如果前者+后者=s,那么输出即可
/*
思路:利用2个指针,1个指针指向第一个数字,1个指针指向最后一个数字
*/
class Solution {
public:
vector<int> FindNumbersWithSum(vector<int> array,int sum) {
vector<int> outputVec;
int min = INT_MAX;
int startP = 0;
int endP = array.size()-1;
while(startP<endP){
int numSum = array[startP] + array[endP];
if(numSum<sum){
startP++;
}
else if (numSum>sum){
endP--;
}
else{
if(array[startP]*array[endP]<min){
min = array[startP]*array[endP];
if(outputVec.empty()){
outputVec.push_back(array[startP]);
outputVec.push_back(array[endP]);
}
else{
outputVec[0]=array[startP];
outputVec[1]=array[endP];
}
}
startP++;
endP--;
}
}
return outputVec;
}
};
和为s的连续正数序列
题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列1~5,4~6和7~8
输入:15
输出:1~5,4~6和7~8
思路:1、参照前面那道题《和为s的两个数字的思路》,同样设置2个指针
2、不过这2个指针的指向稍微改一下,第一个指针指向第一个数字1,第二个指针指向第二个数字2
3、求第一个指针到第二个指针的和:sum,如果sum>s,第一个指针往前面走一位;
4、如果sum< s,第二个指针往前面走一位;
5、如果sum=s,第一个指针和第二个指针同时往前面走一位;
6、终止条件就是当第一个指针<(1+s)/2,终止;举个例子,比如累加是50,当第一个指针指向25时,那么第二个指针肯定要指向26以后了,那么累加的和肯定会>50,所以当第一个指针>(1+s)/2后的结果都是不符合条件的
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int> > outputVec;
vector<int> outputTemp;
int small = 1;
int big = 2;
int numSum = small + big;
int middle = (1 + sum)/2;
while(small<middle){
if(numSum<sum){
big++;
numSum+=big;
}
else if (numSum>sum){
numSum-=small;
small++;
}
else{
for(int i=small;i<=big;i++){
outputTemp.push_back(i);
}
outputVec.push_back(outputTemp);
outputTemp.clear();
big++;
numSum+=big;
numSum-=small;
small++;
}
}
return outputVec;
}
};