【剑指offer】面试题41:和为 s 的两个数字 VS 和为 s 的连续正数序列

题目:

输出所有和为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;
    }
};

 

posted @ 2015-08-27 22:49  不系之舟530  阅读(158)  评论(0编辑  收藏  举报