• 57 和为S的数字


    题目一:和为S的两个数字

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

    输出描述:

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

    测试序列

    1)功能测试(数组中存在和为s的两个数;数组中不存在和为s的两个数)

    2)特殊输入测试(数组指针为空指针)

    解题思路:

    使用两个指针分别指向首尾,然后根据和不断向中间逼近,遇到的第一个满足条件的两个数,就是乘积最小的(原理同 正方形、矩阵周长相同,正方向面积大 可知,4*4>2*6)。

    class Solution {
    public:
        vector<int> FindNumbersWithSum(vector<int> array,int sum) {
            int size = array.size();
            vector<int> res;
            if(size<2)
                return res;
            
            int front = 0, back = size-1;
            
            while(back>front){
                int s = array[back]+array[front];
                if(s==sum){
                    res.push_back(array[front]);
                    res.push_back(array[back]);
                    break;
                }else if(s<sum){
                    front++;
                }else{
                    back--;
                }
            }
            
            return res; //没有找到,直接返回空的res
            
        }
    };
    

      

    题目二:和为S的连续正数序列

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

    输出描述:

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

    测试序列

    1)功能测试(存在和为s的连续序列;不存在和为s的连续序列)

    2)边界值测试(连续序列的最小和3)

    解题思路:

    仍然使用双指针,记录序列的首尾(最大值与最小值)

    如果从front到back序列和大于sum,则可以从序列中去掉较小的值,即增大front的值

    如果从front到back序列和小于sum,则可以增大back的值,让序列包含更多的数

    因为序列中至少有两个数字,因此一直增加front到(1+sum)/2为止

    class Solution {
    public:
        vector<vector<int> > FindContinuousSequence(int sum) {
            vector<vector<int> >  res;
            if(sum<3)    //两个正数的和至少是3
                return res;
            
            int front = 1, back=2; //不能初始化为 0/1
            int mid = (1+sum)/2;
            //while(front<back && back<sum){
            while(front<mid){
                int s = getSeqSum(front, back); 
                if(s==sum){
                    vector<int> line;
                    for(int i=front;i<=back;i++){
                        line.push_back(i);
                    }
                    res.push_back(line);
                    front++;  //重新找
                }else if(s<sum){
                    back++;
                }else{
                    front++; //并更新back
                    //不用更新back!!
                    //back--; //会造成front==back的情况,然后不满足while循环
                    //back=front+1;  //有比较好的更新么 
                }
            }
            return res;
        }
        
        int getSeqSum (int front, int back){
            int ssum = (front+back)*(back-front+1)/2;
            return ssum;
        }
    };
    
    

      

  • 相关阅读:
    170110-学习MoveIt!
    12.29-ros-gazebo高级
    12.27-ros-gazebo基础
    4.9-Simulation in gazebo or webots
    6.28-机器人模拟器Gazebo基础
    4.8-URDF in ROS
    Win32双缓冲画图原理
    Win32 计时器
    最简化的DirectX 11开发环境的配置 VS2010
    VS2010 C++编译报错LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  • 原文地址:https://www.cnblogs.com/GuoXinxin/p/10840911.html
Copyright © 2020-2023  润新知