剑指57:和为S的数字-----和为S的连续正数序列

题目描述1 和为S的数字

输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

输出描述:

对应每个测试案例,输出两个数,小的先输出。

思路:两个指针指向收尾,对于一个递增数组而言,乘积最小和为S的理想情况是左侧保持最小,

       对于两个指针位置的数之和 大于S则将尾左移,小于S则将首右移

class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> result;
        if(array.empty())
            return result;
        vector<int>::iterator start,end;
        for(start=array.begin(),end = array.end()-1;start<end;){
            int cursum = *start + *end;
            if(cursum>sum)
                end--;
            else if(cursum==sum)
            {
                result.push_back(*start);
                result.push_back(*end);
                break;
            }
            else if(cursum<sum)
                start++;
        }
        return result;
    }
};

题目描述2 和为S的连续正数序列

小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列?Good Luck!

输出描述:

输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序

思路:  一定是增1的连续序列 且其中包含的数字个数大于等于2 

        可以参考两个指针一个指向头一个指向尾 同时设置头上的数不超过 (1+sum)/2来规避个数为1的情况

        当总和>sum 时 左侧下标增加

                   <           右侧       增加       

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int>>result;
        result.clear();
        vector<int> res;
        res.clear();
        if(sum<=1)
            return result;
        int small=1,big=2;
        res.push_back(small);
        res.push_back(big);
        int mid = (sum+1)/2;
        int total=small + big;
        while(small<mid){
            if(total<sum)
            {
               res.push_back(++big);
               total += big;
            }
            else if(total >= sum){
                if(total==sum)
                    result.push_back(res);
                res.erase(res.begin());
                total -= small;
                small++;
            }
        }
        return result;
    }
};





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值