剑指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 };

 

posted @ 2019-07-18 17:11  妮妮熊  阅读(141)  评论(0编辑  收藏  举报