每日一练(30):和为s的连续正数序列

简介: 输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。

序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。


示例 1:


输入:target = 9

输出:[[2,3,4],[4,5]]


示例 2:


输入:target = 15

输出:[[1,2,3,4,5],[4,5,6],[7,8]]


限制:


1 <= target <= 10^5


来源:力扣(LeetCode)


链接:https://leetcode-cn.com/probl...


方法一:暴力求和公式


vector<vector<int>> findContinuousSequence(int target) {
    if (target < 3) {
        return {};
    }
    int left = 1;
    double right = 2.0;
    vector<vector<int>> res;
    while (left < right) {
        right = (-1 + sqrt(1 + 4 * (2 * target + (long)left * left - left))) / 2;
        if (left < right && right == (int) right) {
            vector<int> ans;
            for (int i = left; i <= (int)right; i++) {
                ans.push_back(i);
            }
            res.push_back(ans);
        }
        left++;
    }
    return res;
}


方法二:滑动窗口


算法流程:


1.初始化: 左边界 left = ,右边界 right = 2 ,元素和 sum = 3 ,结果列表 res ;


2.循环: 当 left >= right 时跳出;


  • 当 sum > targets时: 向右移动左边界 left = left + 1 ,并更新元素和 sum ;
  • 当 sum < targets 时: 向右移动右边界 right = right + 1 ,并更新元素和 sum ;
  • 当 sum = targets 时: 记录连续整数序列,并向右移动左边界 left = left + 1 ;


3.返回值: 返回结果列表 res ;


vector<vector<int>> findContinuousSequence(int target) {
    if (target < 3) {
        return {};
    }
    int left = 1, right = 2, sum = 3;
    vector<vector<int>> res;
    while (left < right) {
        if (sum == target) {
            vector<int> vec;
            for (int i = left; i <= right; i++) {
                vec.push_back(i);
            }
            res.push_back(vec);
        }
        if (sum >= target) {
            sum -= left;
            left++;
        } else {
            right++;
            sum += right;
        }
    }
    return res;
}
目录
相关文章
|
1月前
|
机器学习/深度学习
【剑指offer】-和为S的连续正数序列-39/67
【剑指offer】-和为S的连续正数序列-39/67
剑指offer 64. 和为S的连续正数序列
剑指offer 64. 和为S的连续正数序列
50 0
Leecode 面试题57 - II. 和为s的连续正数序列
Leecode 面试题57 - II. 和为s的连续正数序列
40 0
|
C++
C/C++每日一练(20230503) 递增数串、缺失正数、最大矩形
C/C++每日一练(20230503) 递增数串、缺失正数、最大矩形
87 0
leetcode-829. 连续整数求和(数论)
这题求连续正整数,刚好满足等差数列,可以用等差数列求和公式 n = (i + (i + k)) * (k + 1) / 2 其中i是连续正整数的首项,k是尾项和首项的差值
91 0
leetcode-829. 连续整数求和(数论)
|
JavaScript Go
剑指Offer面试题57 - II. 和为s的连续正数序列
剑指Offer面试题57 - II. 和为s的连续正数序列
剑指Offer面试题57 - II. 和为s的连续正数序列
LeetCode 面试题57 - II. 和为s的连续正数序列 LCOF
LeetCode 面试题57 - II. 和为s的连续正数序列 LCOF
LeetCode每日一题——829. 连续整数求和
给定一个正整数 n,返回 连续正整数满足所有数字之和为 n 的组数 。
88 0
|
Python
面试题57 - II. 和为s的连续正数序列
面试题57 - II. 和为s的连续正数序列
面试题57 - II. 和为s的连续正数序列