LeetCode-754.到达终点数字

在这里插入图片描述
地址:https://leetcode-cn.com/problems/reach-a-number/
思路:
首先对于target,其正负结果是一样的,其负值就相当于正值走的路径方向相反,因此对其考虑正值
设最少走 n 步,那么首先 s = n ∗ ( n + 1 ) 2 ⩾ t a r g e t s = \frac{n*(n+1)}{2} \geqslant target s=2n(n+1)target.
则 n=sqrt(2*target);
若 s = target.则 res=n;
若 s < target.则 ++n;
设 向右走了 s1 步,向左走了 s2 步,则
(1) s1 + s2 = s
(2) s1 - s2 = target
则 s1 = (s + target)/2 ,因此 (s + target) 必须为偶数
s2 = s - s1, 那么只要能凑出 s2 就能够使等式(1),(2)成立
而 s 由 1 + 2 + … + n组成,s2 < s,故 s 必能凑成 s2
因此只要使得 s ⩾ t a r g e t , ( s + t a r g e t ) % 2 = = 0 s \geqslant target, (s + target) \%2 == 0 starget,(s+target)%2==0 成立即可

Code:

class Solution {
public:
    int reachNumber(int target) {
        if(target<0)    target*=-1;
        int res=sqrt(2*target);
        if(res*(res+1)/2<target)    ++res;
        while((res*(res+1)/2+target)%2){
            ++res;
        }
        return res;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值