题目:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:
small代表序列最小数字,large代表序列最大数字。初始化small为1,large为2.
如果序列当前和curSum大于要找的数s,则small往前移;如果序列当前和小于s,则large往前移。当然每次要更新curSum。
注意的是当curSum等于s时,要更新large
注意:有循环的,要注意循环内的各个分支,不要出现死循环。(连续两题了)
代码:
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int> > res; int small=1,large=2; int curSum=small+large; while(small<sum/2+1) { if(curSum>sum) { curSum-=small; small++; } else if(curSum<sum) { large++; curSum+=large; } else { vector<int> seq; for(int i=small;i<=large;++i) seq.push_back(i); res.push_back(seq); ++large;//不要忘了这两句噢!!! curSum+=large; } } return res; } };
题目:
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
思路:
small和big分别指向序列的首尾,当和大于S时,big往回走;当和小于S时,small往前走。
注意:small和big都是下标,计算和以及返回的时候,都要用array,不要直接用下标了。
代码:
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { vector<int> res; if(array.size()<1) return res; int small=0,big=array.size()-1; while(small<big) { int curSum=array[small]+array[big];//注意这里small和big都是下标,不要直接相加噢 if(curSum==sum) { res.push_back(array[small]);//输出也是,array[small],small仅仅是下标 res.push_back(array[big]); return res; } else if(curSum>sum) { big--; } else { small++; } } return res; } };