57 和為S的數字
阿新 • • 發佈:2019-05-09
最小和 ret fcc bre 但是 好的 初始化 class push_back
題目一:和為S的兩個數字
輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
輸出描述:
對應每個測試案例,輸出兩個數,小的先輸出。
測試序列
1)功能測試(數組中存在和為s的兩個數;數組中不存在和為s的兩個數)
2)特殊輸入測試(數組指針為空指針)
解題思路:
使用兩個指針分別指向首尾,然後根據和不斷向中間逼近,遇到的第一個滿足條件的兩個數,就是乘積最小的(原理同 正方形、矩陣周長相同,正方向面積大 可知,4*4>2*6)。
class Solution { public: vector<int> FindNumbersWithSum(vector<int> array,int sum) { int size = array.size(); vector<int> res; if(size<2) return res; int front = 0, back = size-1; while(back>front){ int s = array[back]+array[front]; if(s==sum){ res.push_back(array[front]); res.push_back(array[back]); break; }else if(s<sum){ front++; }else{ back--; } } return res; //沒有找到,直接返回空的res } };
題目二:和為S的連續正數序列
小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18,19,20,21,22。現在把問題交給你,你能不能也很快的找出所有和為S的連續正數序列? Good Luck!
輸出描述:
輸出所有和為S的連續正數序列。序列內按照從小至大的順序,序列間按照開始數字從小到大的順序
測試序列
1)功能測試(存在和為s的連續序列;不存在和為s的連續序列)
2)邊界值測試(連續序列的最小和3)
解題思路:
仍然使用雙指針,記錄序列的首尾(最大值與最小值)
如果從front到back序列和大於sum,則可以從序列中去掉較小的值,即增大front的值
如果從front到back序列和小於sum,則可以增大back的值,讓序列包含更多的數
因為序列中至少有兩個數字,因此一直增加front到(1+sum)/2為止
class Solution { public: vector<vector<int> > FindContinuousSequence(int sum) { vector<vector<int> > res; if(sum<3) //兩個正數的和至少是3 return res; int front = 1, back=2; //不能初始化為 0/1 int mid = (1+sum)/2; //while(front<back && back<sum){ while(front<mid){ int s = getSeqSum(front, back); if(s==sum){ vector<int> line; for(int i=front;i<=back;i++){ line.push_back(i); } res.push_back(line); front++; //重新找 }else if(s<sum){ back++; }else{ front++; //並更新back //不用更新back!! //back--; //會造成front==back的情況,然後不滿足while循環 //back=front+1; //有比較好的更新麽 } } return res; } int getSeqSum (int front, int back){ int ssum = (front+back)*(back-front+1)/2; return ssum; } };
57 和為S的數字