随笔 - 384  文章 - 0  评论 - 0  阅读 - 13万

力扣745(java&python)-达到终点数字(中等)

题目:

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

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

每次你可以选择向左或向右移动。
第 i 次移动(从  i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。

 

示例 1:

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

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

提示:

-109 <= target <= 109
target != 0

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reach-a-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

参考题解:

@【宫水三叶】:https://leetcode.cn/problems/reach-a-number/solution/by-ac_oier-o4ze/

和@【爪哇缪斯】:https://leetcode.cn/problems/reach-a-number/solution/by-muse-77-g0il/

题目的意思就是:

移动的方向:向左或者向右移动

移动的距离:根据第 i 步 走 i 这么长的距离

例如:

第1步,移动的距离为1;

第2步,移动的距离为2;

第3步,移动的距离为3;

以此类推

 有两种情况:

1.只朝一个方向走,一直朝左或者右走,移动numMoves次,正好可以到达target;

2.朝两个方向走,移动numMoves次,到达target。

数轴上的点都是以0为中心对称点,故只需要考虑一边就可以了,这里考虑正数的方向,将taret取绝对值。

参考图解:

 先往靠近target的方向(正数方向)移动,前进的值为1+2+3+4...+ n = (n+1)*n / 2,根据最终所走的步数num是等于target,还是大于等于target位置分情况讨论:

  • 直接到达target,此时消耗的就是最小步数,可直接返回;
  • 超过target,差值为num- target,根据上面的图解可以看出,2 * A一定为偶数,如果这时候num - target 为偶数即【(num - target) mod 2  == 0】,就能通过前面的某一步反向移动,那么sum 值就可以减少num - target,从而移动到target位置上。

java代码:

复制代码
 1 class Solution {
 2     public int reachNumber(int target) {
 3         int ans = 0, num = 0, t = Math.abs(target);
 4         while(num < t || (num - t) % 2 != 0){
 5             ans += 1;
 6             num += ans;
 7         }
 8         return ans;
 9     }
10 }
复制代码

 

python3代码:

1 class Solution:
2     def reachNumber(self, target: int) -> int:
3         target = abs(target)
4         num = ans = 0
5         while num < target or (num - target)% 2 != 0:
6             ans += 1
7             num += ans
8         return ans

posted on   我不想一直当菜鸟  阅读(51)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示