zoukankan      html  css  js  c++  java
  • 剑指offer系列33:和为S的两个数字VS何为S的连续正数

    第一个题,我想到的思路是一个个找的方法。看书上是设置两个指针然后两个指针一起走。确实这种时间复杂度更低。本来我看到有多组输出乘积最小的我还写了一个专门判断哪一对乘积最小的代码。看到别人证明说找到的第一对就是最小的,所以就没放。我发现这种使用两个指针从两端走的题目真的很多,以后遇见题可以往这方面考虑。

     1 class Solution {
     2 public:
     3     vector<int> FindNumbersWithSum(vector<int> array, int sum)
     4     {
     5         vector<int> re;
     6         if (array.empty() || sum == 0)
     7             return re;
     8         for (auto b = array.begin(), e = array.end() - 1; b< e;)
     9         {
    10             if (*b + *e == sum)
    11             {
    12                 re.push_back(*b);
    13                 re.push_back(*e);
    14                 break;
    15             }
    16             else {
    17                 if (*b + *e < sum)
    18                     ++b;
    19                 else
    20                     --e;
    21             }
    22         }
    23         return re;
    24     }
    25 };

    第二个题,取连续的正数序列和为S。去两个数分别为small和big代表所取的序列的两端。开始设置为small=1,big=2。对序列内的数字求和,如果等于S就放进vector,如果小于s,求将big++,增加一个数字。如果大于S,就small++,删掉一个小的数字。

     1 class Solution 
     2 {
     3 public:
     4     vector<vector<int> > FindContinuousSequence(int sum) 
     5     {
     6         vector<vector<int> > re;
     7         if (sum <= 0)
     8             return re;
     9 
    10         for (int i = 1, j = 2; j <= sum / 2 + 1;)
    11         {
    12             int s = 0;
    13             for (int k = i; k <= j; k++)
    14                 s = s + k;
    15             if (s == sum)
    16             {
    17                 vector<int> tem;
    18                 for (int k = i; k <= j; k++)
    19                     tem.push_back(k);
    20                 re.push_back(tem);
    21                 j++;//记住在for循环里无论哪一种情况都要对变量更新
    22             }
    23             else
    24             {
    25                 if (s < sum)
    26                 {
    27                     j++;
    28                 }
    29                 else
    30                 {
    31                     i++;
    32                 }
    33             }
    34         }
    35         return re;
    36     }
    37 };
  • 相关阅读:
    legend3---videojs存储视频的播放速率便于用户观看视频
    legend3---mathjax的动态渲染问题解决
    matplotlib库疑难问题---10、画直方图
    matplotlib库疑难问题---9、画箭头(综合实例)
    js释放图片资源
    javascript中的原型与原型链
    前端跨域方式
    matplotlib清除 axes 和 figure
    matplotlib画直方图细解
    CentOS 7.8 安装 Python 3.8.5
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11208595.html
Copyright © 2011-2022 走看看