• 剑指 Offer 57


    思路

    方法一:枚举 + 暴力

     

     1 class Solution {
     2 public:
     3     vector<vector<int>> findContinuousSequence(int target) {
     4         vector<vector<int>> res;
     5         for(int i = 1; i <= target/2; ++i) {
     6             vector<int> tmp;
     7             int sum = 0;
     8             for(int j = i; j < target && sum < target; ++j) {
     9                 sum += j;
    10                 tmp.push_back(j);
    11             }
    12 
    13             if(sum == target) {
    14                 res.push_back(tmp);
    15             }
    16         }
    17 
    18         return res;
    19     }
    20 };

     

     1 class Solution {
     2 public:
     3     vector<vector<int>> findContinuousSequence(int target) {
     4         vector<vector<int>> vec;
     5         vector<int> res;
     6         int sum = 0, limit = (target - 1) / 2; // (target - 1) / 2 等效于 target / 2 下取整
     7         for (int x = 1; x <= limit; ++x) {
     8             long long delta = 1 - 4 * (x - 1ll * x * x - 2 * target);
     9             if (delta < 0) {
    10                 continue;
    11             }
    12             int delta_sqrt = (int)sqrt(delta + 0.5);
    13             if (1ll * delta_sqrt * delta_sqrt == delta && (delta_sqrt - 1) % 2 == 0) {
    14                 int y = (-1 + delta_sqrt) / 2; // 另一个解(-1-delta_sqrt)/2必然小于0,不用考虑
    15                 if (x < y) {
    16                     res.clear();
    17                     for (int i = x; i <= y; ++i) {
    18                         res.push_back(i);
    19                     }
    20                     vec.push_back(res);
    21                 }
    22             }
    23         }
    24         return vec;
    25     }
    26 };

     

     1 class Solution {
     2 public:
     3     vector<vector<int>> findContinuousSequence(int target) {
     4         vector<vector<int>> res;
     5         int l = 1, r = 2;
     6         while(l < r) {
     7             int sum = (r-l+1)*(l+r)/2;
     8             if(sum == target) {
     9                 vector<int> tmp;
    10                 for(int i = l; i <= r; ++i)
    11                     tmp.push_back(i);
    12                 res.push_back(tmp);
    13                 ++l;
    14             } else if(sum < target) {
    15                 ++r;
    16             } else {
    17                 ++l;
    18             }
    19         }
    20 
    21         return res;
    22     }
    23 };

    也可以不使用求和公式求sum,而是每次对指针进行移动的时候,同时对sum的值进行改变。代码如下:

     1 class Solution {
     2 public:
     3     vector<vector<int>> findContinuousSequence(int target) {
     4         vector<vector<int>> res;
     5         int i = 1, j = 2;
     6         int sum = 3;
     7         while(i < j) {
     8             if(sum < target) {
     9                 ++j;
    10                 sum += j;
    11             } else if (sum > target) {
    12                 sum -= i;
    13                 ++i;
    14             } else {
    15                 vector<int> v;
    16                 for(int k = i; k <= j; ++k) {
    17                     v.push_back(k);
    18                 }
    19                 res.push_back(v);
    20                 sum -= i;
    21                 ++i;
    22             }
    23         }
    24 
    25         return res;
    26     }
    27 };

    参考

    力扣官方题解 - 和为s的连续正数序列

  • 相关阅读:
    IndexFlatL2、IndexIVFFlat、IndexIVFPQ三种索引方式示例
    Faiss流程与原理分析
    快速排序(快排)
    SSM框架整合Demo
    基于Logistic回归和sigmoid函数的分类算法推导
    Libsvm java工程实践
    LibSvm流程及java代码测试
    排除文件中空行和注释行内容
    linux三剑客-sed命令使用方法
    文件中添加多行内容方法
  • 原文地址:https://www.cnblogs.com/FengZeng666/p/13972325.html
Copyright © 2020-2023  润新知