zoukankan      html  css  js  c++  java
  • 面试题41:和为s的两个数字 || 和为s的连续正数序列

    和为s的两个数字

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

    有点类似于夹逼的思想

    注意两个int相加的和要用long long类型比较规范

     1 bool FindNumbersWithSum(int data[], int length, int sum,
     2                         int* num1, int* num2)
     3 {
     4     if (data == NULL || length < 2)
     5         return false;
     6 
     7     int i = 0;
     8     int j = length - 1;
     9     while (i < j)
    10     {
    11         long long tempSum = data[i] + data[j];
    12         if (tempSum == sum)
    13         {
    14             *num1 = data[i];
    15             *num2 = data[j];
    16             return true;
    17         }
    18         else if (tempSum > sum)
    19             j--;
    20         else
    21             i++;
    22     }
    23     return false;
    24 }

    和为s的连续正数序列

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

    有了解决前面问题的经验,这里也考虑两个数small和big分别表示序列的最小值和最大值。

    首先把small初始化为1,big初始化为2.如果从small到big的序列的和大于S,可以从序列中去掉较小的值,也就是增大small的值。

    如果从small到big的序列的和小于S,可以增大big,让这个序列包含更多的数字。因为这个序列至少要有两个数字,我们一直增加small到(1+S)/2为止。

     1 void FindContinuousSequence(int sum)
     2 {
     3     if(sum < 3)
     4         return;
     5      
     6     int small = 1;
     7     int big = 2;
     8     int middle = (1 + sum) / 2;
     9     int curSum = small + big;
    10      
    11     while(small < middle)
    12     {
    13         if(curSum == sum)
    14             PrintContinuousSequence(small, big);
    15          
    16         while(curSum > sum && small < middle)
    17         {
    18             curSum -= small;
    19             small++;
    20              
    21             if(curSum == sum)
    22                 PrintContinuousSequence(small, big);
    23         }
    24          
    25         big++;
    26         curSum += big;
    27          
    28     }
    29 }
    30  
    31 void PrintContinuousSequence(int small, int big)
    32 {
    33     for(int i = small; i <= big; ++i)
    34         printf("%d ", i);
    35     printf("
    ");
    36 }

     普通方法:

    vector<vector<int> > FindContinuousSequence(int sum) {
        vector<vector<int> > result;
        int i = 1;
        int j;
        while (i <= sum / 2)
        {
            int j = i + 1;
            int curSum = i + j;
            while (curSum <= sum)
            {
                if (curSum == sum)
                {
                    vector<int> tmp;
                    for (int q = i; q <= j; q++)
                        tmp.push_back(q);
                    result.push_back(tmp);
                    break;
                }
                else
                {
                    j++;
                    curSum += j;
                }
            }
            i++;
        }
        return result;
    }

    高效率:

  • 相关阅读:
    位运算 & 网络序字节序
    TFTP & commons-net-3.3.jar
    存储过程
    poj1185-炮兵阵地(状态压缩dp)
    hdu4570-区间dp
    codevs1026-dp(记忆化搜索)
    hdu1494 跑跑卡丁车(动态规划)
    hdu5094-Maze
    hdu4403- A very hard Aoshu problem(搜索)
    hdu2510-符号三角形(dfs+打表)
  • 原文地址:https://www.cnblogs.com/raichen/p/5683611.html
Copyright © 2011-2022 走看看