1. 程式人生 > >57 和為S的數字

57 和為S的數字

最小和 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的數字