劍指offer 面試題41:和為s的兩個數字vs和為s的連續正數序列 c++
阿新 • • 發佈:2018-11-23
題目:輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
思路:兩個 指標,start從前往後遍歷,end從後往前遍歷,如果當前前後之和大於s,end--,如果當前前後之和小於s,start++,這樣能找出乘積最小的和為s的兩個數
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { if(array.size()==0) return array; int start=0; int end=array.size()-1; int allsum = 0; vector<int> ret; while(start <= end) { allsum=array[start]+array[end]; if(allsum==sum) { ret.push_back(array[start]); ret.push_back(array[end]); break; }else if(allsum>sum) end--; else start++; }return ret; } };
題目:小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!
思路:兩個指標,start和end,因為是連續子序列,我們可以用等差數列求和公式(start+end)*(end-start+1)/2來算出當前子序列和。若等於s,則將其序列拿出來,若大於s,說明當前序列多了,start++,若小於s,說明當前序列不夠,end++
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int>> ret; int start = 1,end=2; while(start<end && end<sum) { int cur = (start+end)*(end-start+1)/2; //使用等差數列公式計算連續串和 if(cur < sum) end++; else if(cur > sum) start++; else if(cur==sum) { vector<int> oneseq; for(int i=start;i<=end;++i) oneseq.push_back(i); ret.push_back(oneseq); start++; } }return ret; } };