• 【剑指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;
        }
    };
  • 相关阅读:
    Java 三大主流 工作流 学习
    有限状态机(FSM)的Java 学习FSM
    OSWorkFlow 学习
    三种分布式对象主流技术——COM、Java和COBRA
    Java对象池技术的原理及其实现
    tomcat,很多时候,可以在服务server.xml中可以实现一些效果
    理解Scala
    CAP原理和BASE思想
    Java 在PDF文档中绘制图形
    Java 处理PDF图章(印章)——图片图章、动态图章
  • 原文地址:https://www.cnblogs.com/buxizhizhou/p/4764869.html
Copyright © 2020-2023  润新知