【Lintcode】797. Reach a Number

题目地址:

https://www.lintcode.com/problem/reach-a-number/description

给定一个数轴,可以从 0 0 0出发,第 i i i次移动可以向左或者向右移动 i i i个单位。再给定一个非零的target。问这个target至少需要多少步可以到达。

由于数轴是对称的,所以不妨只考虑target是正数。
如果存在 n n n使得 1 + 2 + . . . + n = t a r g e t 1+2+...+n=target 1+2+...+n=target,那么显然答案就是 n n n
否则的话,我们考虑 1 + 2 + . . . + n 1+2+...+n 1+2+...+n第一次超过 t a r g e t target target的时候。很显然这时候 n − 1 n-1 n1步是不可能到达 t a r g e t target target的。如果 1 + 2 + . . . + n − t a r g e t 1+2+...+n-target 1+2+...+ntarget是偶数,比如说是 r r r,那么将前面的 r / 2 r/2 r/2这个数反个号,得到的和就正好是 t a r g e t target target了,所以此时也是至少需要 n n n步。
上面两个情况可以总结起来得到,如果 1 + 2 + . . . + n − t a r g e t 1+2+...+n-target 1+2+...+ntarget是偶数,其中 1 + 2 + . . . + n − 1 < t a r g e t 1+2+...+n-1<target 1+2+...+n1<target,则至少需要 n n n步。

接下来考虑 1 + 2 + . . . + n − t a r g e t 1+2+...+n-target 1+2+...+ntarget是奇数的情况,那么必须要走接下来的这 n + 1 n+1 n+1步,容易看出,走完第 n + 1 n+1 n+1步后,所在的位置和 t a r g e t target target的差的奇偶性是确定的。
如果 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target是偶数 r r r,那么同样地将 r / 2 r/2 r/2反个号,这个和就等于target了,所以当 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target是偶数的时候,至少需要 n + 1 n+1 n+1步;
否则如果 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target还是奇数,那么 1 + 2 + . . . + n + ( n + 1 ) + ( n + 2 ) − t a r g e t 1+2+...+n+(n+1) + (n+2)-target 1+2+...+n+(n+1)+(n+2)target必然是偶数设为 r r r(因为 1 + 2 + . . . + n − t a r g e t 1+2+...+n-target 1+2+...+ntarget是奇数,如果 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target还是奇数,那说明 n + 1 n+1 n+1是偶数,所以 n + 2 n+2 n+2是奇数,所以 1 + 2 + . . . + n + ( n + 1 ) + ( n + 2 ) − t a r g e t 1+2+...+n+(n+1) + (n+2)-target 1+2+...+n+(n+1)+(n+2)target必然是偶数),这时也是将 r / 2 r/2 r/2反个号就行了,所以至少需要 n + 2 n+2 n+2步。简略证明一下 n + 2 n+2 n+2确实是下界。首先由于 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target是奇数,说明 1 + 2 + . . . + n + ( n + 1 ) − t a r g e t 1+2+...+n+(n+1)-target 1+2+...+n+(n+1)target的加号里无论把哪些加号变为减号,和也是奇数,也就是非 0 0 0,说明 n + 1 n+1 n+1步是不够的。所以 n + 2 n+2 n+2是个下界。

代码如下:

import java.util.Map;

public class Solution {
    /**
     * @param target: the destination
     * @return: the minimum number of steps
     */
    public int reachNumber(int target) {
        // Write your code here
        // i是步数,也是每步的步长;sum是位置
        int i = 0;
        int sum = 0;
        target = Math.abs(target);
        while (sum < target) {
            sum += ++i;
        }
    
        if ((sum - target) % 2 == 0) {
            return i;
        } else {
            if ((sum + i + 1 - target) % 2 == 0) {
                return i + 1;
            } else {
                return i + 2;
            }
        }
    }
}

时间复杂度 O ( n ) O(\sqrt{n}) O(n ),空间 O ( 1 ) O(1) O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值