每日一练(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;
}
目录
相关文章
|
3月前
|
大数据 数据库 索引
索引创建的原则
本文介绍了创建数据库索引的六大原则,帮助提升查询效率。内容包括:为大数据量表建索引、常用查询字段建索引、高区分度列优先、varchar字段使用前缀索引、合理使用联合索引,以及控制索引数量以平衡查询与维护成本。
102 8
|
编解码 计算机视觉 异构计算
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
【CV大模型SAM(Segment-Anything)】如何一键分割图片中所有对象?并对不同分割对象进行保存?
|
7月前
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
11月前
|
负载均衡 Java 持续交付
深入解析微服务架构中的服务发现与负载均衡
深入解析微服务架构中的服务发现与负载均衡
580 7
|
存储 安全 搜索推荐
从长网址到短链接:探索网址缩短的神奇世界
从长网址到短链接:探索网址缩短的神奇世界
434 4
|
Java 数据库连接 API
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
Spring事务管理嵌套事务详解 : 同一个类中,一个方法调用另外一个有事务的方法
1353 1
|
消息中间件 Prometheus 监控
深入解析Kafka消息丢失的原因与解决方案
深入解析Kafka消息丢失的原因与解决方案
1132 0
|
JavaScript 安全 数据安全/隐私保护
JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程
JS逆向 -- 分析某站aid、cid、w_rid和sid的加密过程
504 1
|
Java 关系型数据库 数据库
基于SpringBoot大药房管理系统(程序+数据库+文档)
基于SpringBoot大药房管理系统(程序+数据库+文档)