news 2026/7/18 1:14:57

算法题 到达终点数字

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
算法题 到达终点数字

到达终点数字

问题描述

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

你可以进行移动。每次移动,你可以向左或向右移动,第n次移动(从 1 开始),可以走n步。

返回到达终点需要的最小移动次数。

注意target可能是负数,但由于数轴对称性,我们可以只考虑正数情况。

示例

输入: target = 3 输出: 2 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 3 。
输入: target = 2 输出: 3 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 -1 。 第三次移动,从 -1 到 2 。

算法思路

核心

  1. 对称性target-target的答案相同,所以可以只考虑target >= 0的情况
  2. 累加和:前k步的最大可达距离是S = 1 + 2 + ... + k = k(k+1)/2
  3. 调整方向:如果超过了目标点,可以通过将某些步骤改为向左走来调整位置

代码实现

方法一:逐步累加

classSolution{/** * 计算到达目标位置所需的最小移动次数 * * @param target 目标位置(可以是负数) * @return 最小移动次数 */publicintreachNumber(inttarget){// 利用对称性,只考虑非负目标target=Math.abs(target);intstep=0;// 当前移动次数intsum=0;// 当前累计移动距离(全部向右)// 逐步增加步数,直到满足条件while(sum<target||(sum-target)%2!=0){step++;sum+=step;}returnstep;}}

方法二:数学

classSolution{/** * 使用数学直接计算最小步数 * * @param target 目标位置 * @return 最小移动次数 */publicintreachNumber(inttarget){target=Math.abs(target);// 使用求根公式估算最小的k,使得 k(k+1)/2 >= target// k^2 + k - 2*target >= 0// k >= (-1 + sqrt(1 + 8*target)) / 2intk=(int)Math.ceil((-1+Math.sqrt(1+8.0*target))/2);// 计算对应的累加和intsum=k*(k+1)/2;// 如果差值是偶数,直接返回kif((sum-target)%2==0){returnk;}// 如果差值是奇数,需要继续增加步数// 增加1步:差值变化为 (sum + k + 1 - target) = (sum - target) + (k + 1)// 增加2步:差值变化为 (sum - target) + (k + 1) + (k + 2)// 由于连续两个整数中必有一个是奇数,所以最多再走2步就能得到偶数差值if((sum+k+1-target)%2==0){returnk+1;}else{returnk+2;}}}

算法分析

  • 时间复杂度

    • 方法一:O(√target)
    • 方法二:O(1) - 直接数学计算
  • 空间复杂度:O(1) - 只使用常数空间

算法过程

1:target = 3

  • target = 3(绝对值)
  • step = 0, sum = 0
  • step = 1, sum = 1(1 < 3,继续)
  • step = 2, sum = 3(3 >= 3 且 (3-3)=0 是偶数)
  • 返回2

2:target = 2

  • target = 2(绝对值)
  • step = 0, sum = 0
  • step = 1, sum = 1(1 < 2,继续)
  • step = 2, sum = 3(3 >= 2 但 (3-2)=1 是奇数,继续)
  • step = 3, sum = 6(6 >= 2 且 (6-2)=4 是偶数)
  • 返回3

3:target = 4

  • step = 1, sum = 1
  • step = 2, sum = 3
  • step = 3, sum = 6(6 >= 4 且 (6-4)=2 是偶数)
  • 返回3

路径:+1 + 2 + 3 = 6,需要减少2,所以将第1步反向:-1 + 2 + 3 = 4

测试用例

publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例System.out.println("Test 1 (target=3): "+solution.reachNumber(3));// 2// 测试用例2:需要调整方向System.out.println("Test 2 (target=2): "+solution.reachNumber(2));// 3// 测试用例3:负数目标System.out.println("Test 3 (target=-1): "+solution.reachNumber(-1));// 1// 测试用例4:较大目标System.out.println("Test 4 (target=10): "+solution.reachNumber(10));// 4// 测试用例5:边界情况System.out.println("Test 5 (target=0): "+solution.reachNumber(0));// 0// 测试用例6:需要多步调整System.out.println("Test 6 (target=5): "+solution.reachNumber(5));// 5// 测试用例7:较大数值System.out.println("Test 7 (target=100): "+solution.reachNumber(100));// 13// 测试用例8:验证对称性System.out.println("Test 8 (target=-3): "+solution.reachNumber(-3));// 2// 测试用例9:差值为奇数的情况System.out.println("Test 9 (target=7): "+solution.reachNumber(7));// 5// 测试用例10:刚好等于累加和System.out.println("Test 10 (target=6): "+solution.reachNumber(6));// 3}

关键点

  1. 对称性

    • 正负目标的解相同,简化问题为非负情况
  2. 累加和

    • 前k步的最大可达距离是k(k+1)/2
    • 这是所有步骤都向同一方向移动的情况
  3. 反向调整

    • 将第i步反向会使总和减少2i
    • 只能调整偶数值的距离差
  4. 奇偶性

    • (sum - target)为偶数时,可以直接调整
    • 当为奇数时,需要继续增加步数直到差值变为偶数
    • 最多需要再走2步(因为连续整数的奇偶性交替)
  5. 数学

    • 利用求根公式可以快速估算最小步数

常见问题

  1. 为什么反向操作只能改变偶数值?

    • 原本加i,反向后减i,总变化量是-2i,必为偶数
  2. 为什么最多再走2步就能解决奇数差值问题?

    • 连续两个整数中必有一个奇数
    • 如果当前差值是奇数,加上一个奇数就变成偶数
    • 如果k+1是偶数,则k+2必是奇数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/15 13:51:25

课题申报新手入门必备指南!利用AI辅助搞定 6大关键部分,高效提升申报成功率(附AI提示词)

课题申报已经成为不少教师同仁职业发展、职称评比的必要条件之一,但很多新手老师仍不知道该从何下手。对于厚厚的申报指南和复杂的评审指标,不少教师虽然有研究想法,但卡在选题、创新点等关键环节上。 今天七哥带各位老师将申报书彻底拆解,弄清楚各部分写作技巧,并搭配AI…

作者头像 李华
网站建设 2026/7/18 1:42:49

Advanced Database Cleaner - WordPress数据库清理优化插件

‌Advanced Database Cleaner Pro 是一款专为WordPress设计的数据库清理与优化插件&#xff0c;主要用于删除冗余数据、孤立表、过期瞬态等&#xff0c;以提升网站性能和数据库效率‌。 如果您已经使用WordPress一段时间了&#xff0c;那么您可以考虑一下清理工作。您的数据库…

作者头像 李华
网站建设 2026/7/16 21:50:12

2025 年 12 月找靠谱中国 AI 智能体获客老师,麟哥难道不称职?

一、2025 ai 获客培训市场&#xff1a;讲师选择的核心参考维度2025 年 ai 智能体获客领域的技术迭代&#xff0c;正从通用大模型应用转向垂直场景深度适配。企业在筛选培训讲师时&#xff0c;已逐步跳出单纯的工具操作教学需求&#xff0c;更关注讲师的技术积累、知识体系完整性…

作者头像 李华
网站建设 2026/7/17 21:41:08

海报设计无从下手?这3个技巧让你告别空白画布

面对空白画布无从下手&#xff1f;或是设计出的海报总是少了点吸引力&#xff1f;在信息过载的今天&#xff0c;无论是活动宣传还是个人创作&#xff0c;好的海报设计能让信息传递事半功倍。作为经常需要制作各种宣传物料的设计爱好者&#xff0c;我总结出了三个特别实用的技巧…

作者头像 李华
网站建设 2026/7/17 2:23:20

FastAPI+VUE3创建一个项目的步骤模板(一)

先不细究功能细节&#xff0c;先把项目跑起来 一篇文章最多5606个字&#xff0c;因此同样分多P来记录 为fastapi准备环境 # 1. 创建项目文件夹 mkdir fastvue-todo cd fastvue-todo# 2. 创建并激活虚拟环境 (推荐) python -m venv venv # Windows: # venv\Scripts\activate # L…

作者头像 李华
网站建设 2026/7/17 11:21:09

带你搞懂BootLoader(四)-第三个BootLoader

这篇文章将带你写第三个BootLoader程序&#xff0c;对应的是以下那篇博文的第三种启动方式&#xff1a;应用程序(APP)存储在文件系统里面或者存储在一些非XIP的存储芯片上&#xff0c;BootLoader将APP复制到RAM指定地址&#xff0c;最后通过跳转指令转入RAM中执行APP 带你搞懂B…

作者头像 李华