LeetCode-754. 到达终点数字【数学】

本文介绍LeetCode 754题“到达终点数字”的三种解题思路及实现方法,包括通过观察规律简化问题的直接求解方案,利用数学公式快速定位答案的高效解法,以及结合两者优点的综合策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

在一根无限长的数轴上,你站在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 。

提示:

-10 ^ 9 <= target <= 10 ^ 9
target != 0
https://leetcode.cn/problems/reach-a-number/description/?orderBy=most_votes&languageTags=cpp

解题思路一:三行代码。发现规律,将target取绝对值不影响结果。若未到达终点继续走即可。情况一:若最后s-target为偶数或0,我们发现可以在之前里面反走一步即可(答案刚刚好是n)。情况二:若s-target为奇数,则需要多走一步或者两步,所以while里面取的是或操作。

在这里插入图片描述

class Solution {
public:
    int reachNumber(int target) {
        int t=abs(target),s=0,n=0;
        while(s<t||(s-t)%2) s+=++n;//未到终点或者相距奇数            
        return n;
    }
};

时间复杂度O(n)
空间复杂度O(1)

解题思路二:判断s大于等于target时可以解方程。n*(n+1)/2>target从而解出n,节省时间,然后依据情况二,可以直接判断得出答案。

ceil函数是向上取整

class Solution {
public:
    int reachNumber(int target) {
        target = abs(target);
        int n = ceil((-1 + sqrt(8L * target + 1)) / 2); // 注意 8*target 会超过 int 范围
        return (n * (n + 1) / 2 - target) % 2 == 0 ? n : n + 1 + n % 2;
    }
};

时间复杂度O(1)
空间复杂度O(1)
https://leetcode.cn/problems/reach-a-number/solutions/1947254/fen-lei-tao-lun-xiang-xi-zheng-ming-jian-sqj2/?orderBy=most_votes&languageTags=cpp

解题思路三:0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旋转的油纸伞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值