【每日一题Day17】LC754到达终点数字|数学 等差数列

简介: 在一根无限长的数轴上,你站在0的位置。终点在target的位置。

到达终点数字【LC754】


You are standing at position 0 on an infinite number line. There is a destination at position target.


You can make some number of moves numMoves so that:


  • On each move, you can either go left or right.
  • During the ith move (starting from i == 1 to i == numMoves), you take i steps in the chosen direction.


Given the integer target, return the minimum number of moves required (i.e., the minimum numMoves) to reach the destination.


在一根无限长的数轴上,你站在0的位置。终点在target的位置。


你可以做一些数量的移动 numMoves :


  • 每次你可以选择向左或向右移动。
  • 第 i 次移动(从 i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。


给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。


还好dp、递归写不出来,就直接看题解了,这不是我能想到的方法


  • 思路


1.数轴上的任意点都以起点(0 点)对称,只需要考虑对称点的任意一边


左边所能到达任意一个点,都能通过调整所达路径的方向来将终点调整到右边。


2.先往靠近 target 的方向移动,到达或越过 target 的时候则停止


。若能直接到达 target,此时消耗的必然是最小步数,可直接返回;

。若越过了target,那么需要考虑是否需要增加额外步数到达target


3.我们假设需要调整的步数总和为tot,则有$ dist−2×tot=target,变形可得 ,变形可得,变形可得tot = \frac{dist - target}{2}$


。当tot为整数时,即$ dist−target$为偶数时,不需要引入额外步数,只需要将某些数反向即可

。当tot不为整数时,即$ dist−target$为奇数时,只能引入额外步数,继续往右走,使两者差值为偶数


  • 实现


class Solution {
    public int reachNumber(int target) {
        while (target < 0){
            target = -target;
        }
        int dis = 0;
        int i = 1;
        while (dis < target || (dis > target && (dis - target) % 2 == 1 ) ){
            dis += i;
            i++;
        }       
        return i - 1;
    }
}


  • 复杂度


。时间复杂度:O ( n )


。空间复杂度:O ( 1 )


  • 代码优化:利用等差数列的性质,找到第一个S k > = t a r g e t


。等差数列前n项和计算公式


image.png


。当a 0 = 0 、 a 1 = 1 、当前步数为k、d=1时,


image.png


。首先找到第一个S k > = t a r g e t ,k = s q r t ( 2 ∗ t a r g e t ) ,此时移动的距离为S k


。代码


只需判断是否需要进行额外移动,额外移动最多4次


class Solution {
    public int reachNumber(int target) {
        if (target < 0) target = -target;
        int k = (int) Math.sqrt(2 * target) , dist = k * (k + 1) / 2;
        while (dist < target || (dist - target) % 2 == 1) {
            k++;
            dist = k * (k + 1) / 2;
        }
        return k;
    }
}


。复杂度


  • 时间复杂度:O ( 1 )


  • 空间复杂度:O ( 1 )
目录
相关文章
|
存储 Java
Java 中 ArrayList 的初始大小是多少?
【8月更文挑战第23天】
432 0
|
缓存 网络协议 前端开发
CDN最佳实践之访问慢的分析思路和优化方案
使用CDN加速以后还是存在访问慢的情况,如何去分析定位问题、优化网站速度、解决用户问题是一个十分重要的课题。本文介绍了CDN加速访问慢的分析思路,通过归纳的一些原因结合搜集的信息去进一步判断定位问题,帮助用户在遇到问题时有一个更清晰的思考方法论。同时介绍了一些典型的问题场景,结合这些问题场景可以更快速的去发现问题并优化。
2917 1
CDN最佳实践之访问慢的分析思路和优化方案
|
算法 Java Go
Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!
Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!
967 0
Github 疯传!史上最强!BAT 大佬「LeetCode刷题手册」电子书开放下载了!
路歌,15亿背后的ALPD故事
数字经济时代,阿里云已经不仅仅是庞大的云基础设施。基于丰富的实践经验和技术优势,阿里云为企业提供随时随地的智能移动协同,重塑运营管理流程,帮助企业数字化升级。
5287 0
|
15天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
7天前
|
云安全 人工智能 安全
Dify平台集成阿里云AI安全护栏,构建AI Runtime安全防线
阿里云 AI 安全护栏加入Dify平台,打造可信赖的 AI
|
10天前
|
人工智能 运维 Java
Spring AI Alibaba Admin 开源!以数据为中心的 Agent 开发平台
Spring AI Alibaba Admin 正式发布!一站式实现 Prompt 管理、动态热更新、评测集构建、自动化评估与全链路可观测,助力企业高效构建可信赖的 AI Agent 应用。开源共建,现已上线!
931 29