剑指offer57-II.和为s的连续正数序列

news2024/11/26 18:43:04

看完题脑子里闪过了暴力法,就是从1开始往后累加,直到累加和等于或大于target,如果等于就放进数组,如果大于就从2开始加,但是这种想法只是闪过一下,因为我觉得加上填充数组需要3层循环肯定会超时,于是就直接想能不能有其他方法。

盯着15这个示例的答案看了一会我就想到了,15的答案里面有3个的有5个的,所以我可以去寻找target的因数,这个因数就是其中一个答案的中间那个数,target除以这个因数你就可以知道有多少个数,比如3是15的因数,15是3的5倍,就可把3放在5个相邻的自然数中间这样就出来了,但是这样只能判断出包含奇数个自然数的答案,无法判断偶数个自然数的答案,比如15的7和8那个答案就判断不出,然后我又盯着这两个案例看,我发现如果target除以这个偶数n余数是n/2就可以,比如9%2=2/2;于是9看可以分成4和5,15%2=2/2,所以15可以分成7和8,10%4=4/2,所以10可以分成1,2,3,4,5;8%2!=2/2,所以8不能分成2个连续自然数。

所以可以写1层循环,i表示target能分成的自然数的个数,因为个数要大于2,所以i从target/2取到2,首先判断i是奇数还是偶数,如果是奇数,看看是不是target的因数,如果是因数就可以取;如果是偶数,看看target%i是不是等于i/2,如果是就可以取。

那么该如何取呢?直接用target除以i,得到的数是平均数。平均数减去(i-1)/2,得到的数是第1个数,判断一下第一个数是不是大于0,小于0就跳过进入下一次循环,大于0的话就可以从第一个数开始取连续的i个数作为答案放进二维数组,以下是我的代码。

class Solution {
    public int[][] findContinuousSequence(int target) {
         int[][] res = new int[100][target/2];
         int index = 0;
         for(int i =target/2;i>1;i--){
             if(i % 2 == 1){
                 if(target % i == 0){
                      int a = target / i;
                      int begin = a-(i-1)/2;
                      if(begin<1)continue;
                      int[] b = new int[i];
                      for(int j=0;j<i;j++){
                          b[j] = (a-(i-1)/2)+j;
                      }
                      res[index++] = b;
                      //index++;
                 }
             }else{
               if(target % i == i/2){
                    double aver = target / i;
                    int[] c = new int[i];
                    double begin = aver-(i-1)/2;
                    if(begin<1)continue;
                    for(int k =0;k<i;k++){
                        c[k] = (int)begin + k;
                    } 
                    res[index++] = c;
                    //index++;
               }
             }
         }
         int[][] result = new int[index][target/2];
         for(int i =0;i<index;i++){
             result[i] = res[i];
         }
         return result;
    }
}

 写完之后看了一下题解,没想到题解第一个就用了暴力法,真打脸,

class Solution {
    public int[][] findContinuousSequence(int target) {
        List<int[]> vec = new ArrayList<int[]>();
        int sum = 0, limit = (target - 1) / 2; // (target - 1) / 2 等效于 target / 2 下取整
        for (int i = 1; i <= limit; ++i) {
            for (int j = i;; ++j) {
                sum += j;
                if (sum > target) {
                    sum = 0;
                    break;
                } else if (sum == target) {
                    int[] res = new int[j - i + 1];
                    for (int k = i; k <= j; ++k) {
                        res[k - i] = k;
                    }
                    vec.add(res);
                    sum = 0;
                    break;
                }
            }
        }
        return vec.toArray(new int[vec.size()][]);
    }
}

提解第二种是用的数学方法,他直接算出第一个数x最后一个数y和taget的数学关系,然后从1到target/2取遍历x,每遍历一个x都通过求根公式算出一个y,看看这个y是否合理,合理就取。

class Solution {
    public int[][] findContinuousSequence(int target) {
        List<int[]> vec = new ArrayList<int[]>();
        int sum = 0, limit = (target - 1) / 2; // (target - 1) / 2 等效于 target / 2 下取整
        for (int x = 1; x <= limit; ++x) {
            long delta = 1 - 4 * (x - (long) x * x - 2 * target);
            if (delta < 0) {
                continue;
            }
            int delta_sqrt = (int) Math.sqrt(delta + 0.5);
            if ((long) delta_sqrt * delta_sqrt == delta && (delta_sqrt - 1) % 2 == 0) {
                int y = (-1 + delta_sqrt) / 2; // 另一个解(-1-delta_sqrt)/2必然小于0,不用考虑
                if (x < y) {
                    int[] res = new int[y - x + 1];
                    for (int i = x; i <= y; ++i) {
                        res[i - x] = i;
                    }
                    vec.add(res);
                }
            }
        }
        return vec.toArray(new int[vec.size()][]);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/877747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java毕业设计-智慧食堂管理系统-内容快览

首页 智慧食堂管理系统是一种可以提高食堂运营效率的管理系统。它将前端代码使用Vue实现&#xff0c;后端使用Spring Boot实现。这个系统的目的是简化食堂管理&#xff0c;提高食堂服务质量。在现代快节奏的生活中&#xff0c;人们对餐饮服务提出了更高的要求&#xff0c;食堂管…

Spring Boot实现第一次启动时自动初始化数据库流程详解

随着互联网的发展项目中的业务功能越来越复杂&#xff0c;有一些基础服务我们不可避免的会去调用一些第三方的接口或者公司内其他项目中提供的服务&#xff0c;但是远程服务的健壮性和网络稳定性都是不可控因素。 在测试阶段可能没有什么异常情况&#xff0c;但上线后可能会出…

一文详解Apipost数据模型功能

在Apipost数据模型中用户可以预先创建多个数据模型&#xff0c;并在API设计过程中重复利用这些模型来构建API 创建数据模型 在左侧导航点击「数据模型」-「新建数据模型」在右侧工作台配置数据模型参数 引入数据模型 在API设计预定义响应期望下点击引用数据模型&#xff0c;…

实录分享 | 使用Prometheus和Grafana监控Alluxio运行状况

欢迎来到【微直播间】&#xff0c;2min纵览大咖观点 本次分享主要包括三个方面&#xff1a; Prometheus&Grafana简介环境搭建手动调优 一、 Prometheus&Grafana简介关于Prometheus&#xff1a; Prometheus 是一个开源的完整监控解决方案&#xff0c;其对传统监控系…

[SpringBoot3]访问数据库

四、访问数据库 SpringBoot框架为SQL数据库提供了广泛的支持&#xff0c;既有用JdbcTemplate直接访问JDBC同时支持“object relational mapping”技术&#xff08;如MyBtais、Hibernate&#xff09;。SpringData独立的项目提供对多种关系型和非关系型数据库的访问支持&#xf…

【Vue-Router】命名视图

命名视图 同时 (同级) 展示多个视图&#xff0c;而不是嵌套展示&#xff0c;例如创建一个布局&#xff0c;有 sidebar (侧导航) 和 main (主内容) 两个视图&#xff0c;这个时候命名视图就派上用场了。 可以在界面中拥有多个单独命名的视图&#xff0c;而不是只有一个单独的出…

【Maven】SpringBoot项目使用maven-assembly-plugin插件多环境打包

SpringBoot项目使用maven-assembly-plugin插件多环境打包 1.创建SpringBoot项目并在pom.xml文件中添加maven-assembly-plugin配置 <!-- 多环境配置 --><profiles><!-- 开发环境 --><profile><id>dev</id><properties><prof…

Leaflet入门,Leaflet加载xyz地图,以vue-leaflet插件加载高德地图为例

前言 本章介绍Leaflet使用vue2-leaflet或者vue-leaflet插件方式便捷加载xyz高德地图。 # 效果演示 vue如何使用Leaflet vue2如何使用:《Leaflet入门,如何使用vue2-leaflet实现vue2双向绑定式的使用Leaflet地图,以及初始化后拿到leaflet对象,方便调用leaflet的api》 vue3…

代码随想录算法训练营之JAVA|第二十九天|1005. K 次取反后最大化的数组和

今天是第29天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天。 算法挑战链接 1005. K 次取反后最大化的数组和https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/ 第一想法 题目理解&#xff1a;数组在进行K次取反后&#xff0c;求累加的最大值。…

Rust 复数运算,重载加减乘除运算

复数 基本概念 复数定义 由实数部分和虚数部分所组成的数&#xff0c;形如a&#xff0b;bi 。 其中a、b为实数&#xff0c;i 为“虚数单位”&#xff0c;i 的平方等于&#xff0d;1。 a、b分别叫做复数a&#xff0b;bi的实部和虚部。 当b&#xff1d;0时&#xff0c;a&am…

安世收购英国最大晶圆制造厂

据英国《泰晤士报》报道&#xff0c;英国Newport晶圆厂的员工 给 《 泰晤士报 》 的一封措辞强硬的信中&#xff0c;表 示 代表582名员工的员工协会表示。Newport晶圆厂员工们完全支持Nexperi a安世半导体 对工厂的所有权。因为Nexperia提供 了稳定的工作、改善了工作保障、工资…

VBA 学习笔记1 对象以及属性

目录 1 取得VBA对象1.1 取得工作簿对象1.2 取得工作表对象1.3 取得单元格对象1.4 取得对象的属性1.5 文档的方法1 进入vba 界面 方式之一&#xff1a; 快捷键&#xff1a;ALTERF11 运行方式之一&#xff1a; 进入vba界面&#xff0c;点击绿色三角符号 1 取得VBA对象 1.1 取得…

Win10基于 Anaconda 配置 Deeplabcut 环境

最近需要做动物行为学分析的相关研究&#xff0c;同时由于合作者只有 Windows 系统&#xff0c;于是只好在 Windows 中配置环境。说实话还真的是挺折磨的。。。 一、下载 Anaconda 可以通过清华源下载 Anaconda&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/ar…

leetcode剑指 Offer 58 - II. 左旋转字符串(两种方法)

题目&#xff1a;leetcode剑指 Offer 58 - II. 左旋转字符串 描述&#xff1a; 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如&#xff0c;输入字符串"abcdefg"和数字2&#xff0c;该函数将返回…

Gradle依赖管理:编译时和运行时依赖的区别

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

nsq中diskqueue详解 - 第一篇

一、diskqueue是什么&#xff0c;为什么需要它 在nsq中消息主要存在于两种队列 一种是内存队列&#xff0c;内部是用go的通道实现&#xff0c;所以处理速度很快&#xff0c;缺点是一旦nsqd进程挂掉消息就丢失了&#xff0c;这让人难以接受&#xff0c;数据丢了不得被用户骂死…

强训第31天

选择 传输层叫段 网络层叫包 链路层叫帧 A 2^16-2 C D C 70都没收到&#xff0c;确认号代表你该从这个号开始发给我了&#xff0c;所以发70而不是71 B D C 248&123120 OSI 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 C 记一下304读取浏览器缓存 502错误网关 编…

论文总结《Adversarial Personalized Ranking for Recommendation(APR)》

原文链接 APR、 本篇论文是对抗训练在RS领域的先锋作&#xff0c;在这篇文章前对抗训练应用在图像领域&#xff0c;以提高模型鲁棒性。本篇论文填补了对抗训练在RS领域的空缺&#xff0c;首次基于BPR进行对抗训练&#xff0c;以提高RS排序模型的鲁棒性。 Motivation 文章在…

Python脚本之连接MySQL【四】

本文为博主原创&#xff0c;未经授权&#xff0c;严禁转载及使用。 本文链接&#xff1a;https://blog.csdn.net/zyooooxie/article/details/124640412 之前写了篇 Python脚本之连接MySQL【三】&#xff0c;日常使用过程中&#xff0c;代码实际有很多改动&#xff0c;特此更新…

数据分析--帆软报表--大数据大屏

进入国企公司学习有一段时间了&#xff0c;岗位是数据分析方向------ 母前使用的是帆软工具进行的开发。 可以进行大数据大屏 也可使嵌入到手机端。 下面是例子