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

18 篇文章 0 订阅
15 篇文章 0 订阅

和为s的两个数字


题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。

输入:{1,2,4,7,11,15}

输出:4 11

思路:1、利用两个指针,1个指针指向第一个数字,另一个指针指向最后一个数字
2、如果前者+后者>s,那么后一个指针往前面走
3、如果前者+后者 < s,那么前一个指针往后面走
4、如果前者+后者=s,那么输出即可

/*
思路:利用2个指针,1个指针指向第一个数字,1个指针指向最后一个数字
*/
class Solution {
public:
    vector<int> FindNumbersWithSum(vector<int> array,int sum) {
        vector<int> outputVec;
        int min = INT_MAX;
        int startP = 0;
        int endP = array.size()-1;
        while(startP<endP){
            int numSum = array[startP] + array[endP];
            if(numSum<sum){
                startP++;
            }
            else if (numSum>sum){
                endP--;
            }
            else{
                if(array[startP]*array[endP]<min){
                    min = array[startP]*array[endP];
                    if(outputVec.empty()){
                        outputVec.push_back(array[startP]);
                        outputVec.push_back(array[endP]);
                    }
                    else{
                        outputVec[0]=array[startP];
                        outputVec[1]=array[endP];
                    }
                }
                startP++;
                endP--;
            }
        }
        return outputVec;
    }
};

和为s的连续正数序列


题目:输入一个正数s,打印出所有和为s的连续正数序列(至少含有两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以打印出3个连续序列1~5,4~6和7~8

输入:15

输出:1~5,4~6和7~8

思路:1、参照前面那道题《和为s的两个数字的思路》,同样设置2个指针
2、不过这2个指针的指向稍微改一下,第一个指针指向第一个数字1,第二个指针指向第二个数字2
3、求第一个指针到第二个指针的和:sum,如果sum>s,第一个指针往前面走一位;
4、如果sum< s,第二个指针往前面走一位;
5、如果sum=s,第一个指针和第二个指针同时往前面走一位;
6、终止条件就是当第一个指针<(1+s)/2,终止;举个例子,比如累加是50,当第一个指针指向25时,那么第二个指针肯定要指向26以后了,那么累加的和肯定会>50,所以当第一个指针>(1+s)/2后的结果都是不符合条件的

class Solution {
public:
    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > outputVec;
        vector<int> outputTemp;
        int small = 1;
        int big = 2;
        int numSum = small + big;
        int middle = (1 + sum)/2;
        while(small<middle){
            if(numSum<sum){
                big++;
                numSum+=big;
            }
            else if (numSum>sum){
                numSum-=small;
                small++;
            }
            else{
                for(int i=small;i<=big;i++){
                    outputTemp.push_back(i);
                }
                outputVec.push_back(outputTemp);
                outputTemp.clear();
                big++;
                numSum+=big;
                numSum-=small;
                small++;
            }
        }
        return outputVec;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值