1. 程式人生 > >劍指offer 面試題41:和為s的兩個數字vs和為s的連續正數序列 c++

劍指offer 面試題41:和為s的兩個數字vs和為s的連續正數序列 c++

題目:輸入一個遞增排序的陣列和一個數字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;
    }
};