[Leetcode学习-c++&java]Reach a Number

问题:

难度:medium

说明:

假设你有一个无限坐标轴,然后你 第 N 步 可以一次移动 N 个位置(从 1 开始),给出一个坐标 T,求最少多少步可以移动到坐标 T。

题目连接:https://leetcode.com/problems/reach-a-number/

输入范围:

  • target will be a non-zero integer in the range [-10^9, 10^9].

输入案例:

Example 1:
Input: target = 3
Output: 2
Explanation:
On the first move we step from 0 to 1.
On the second step we step from 1 to 3.

Example 2:
Input: target = 2

Output: 3
Explanation:
On the first move we step from 0 to 1.
On the second move we step  from 1 to -1.
On the third move we step from -1 to 2.

我的代码:

数学题,如果用 bfs 肯定空间都爆了,毕竟是 空间占用 指数增长。

1、

假设走 N 步到达,那么其中有 K 步反着走是最短行程

假设输入数字为 T,最少需要 N 步到达 T,如果 N 步都正向望着 T 走,那么从 0 到 第 N 步长度为 SUM = N * (N + 1) << 1

那么如果我其中第一步反着走,从 0 到 第 N 步长度为 SUM - (1 << 1),我第 K 步反着走就是 SUM - (K << 1)

那么某几步反着走就是  SUM - ((K1 + K2 + K3 + .....) << 1) = SUM - (ΣK << 1)

2、

把输入负数都弄成正数,因为走路的逻辑一致。

SUM >= T,所以 N * (N + 1) << 1 >= T

得出:N^2 + N - 2T >= 0 (一元二次方程)

根据一元二次方程求根得:(\sqrt{1 + 8T} - 1) / 2= N1  (N1必定是正数)

3、

从 N1 开始搜索,因为 N1 开始才能获得 SUM >= T

有 SUM - T = X = (K << 1),因为存在 SUM - (K << 1) = T

所以 K =  SUM - T >> 1,如果 SUM - T 是奇数就跳过,不存在 SUM - T 为奇数

那么第 N 步是到达 T的步数,只要有 N + N - 1 >= K 就肯定包含 K1 K2 K3 ...的一个集合,满足 K = SUM - T(为什么刚好 N + N - 1我忘了)

4、

所以比较爽的一道题可以用数学公式搞定

JAVA:

class Solution {
    public int reachNumber(int target) {
        long t = (long)Math.abs(target);
        int begin = (int)Math.ceil((Math.ceil(Math.sqrt(8 * t + 1)) - 1) / 2);
        for(int i = begin;;i ++) {
            int sum = (int)((i * (i + 1) >> 1) - t);
            if((sum & 1) == 0) {
                sum >>= 1;
                if(i + i - 1 >= sum) return i;
            }
        }
    }
}

C++:

class Solution {
public:
    int reachNumber(int target) {
        long t = (long)abs(target);
        int begin = (int)ceil((ceil(sqrt(8 * t + 1)) - 1) / 2);
        for(int i = begin;;i ++) {
            int sum = (int)((i * (i + 1) >> 1) - t);
            if((sum & 1) == 0) {
                sum >>= 1;
                if(i + i - 1 >= sum) return i;
            }
        }
    }
};

猜你喜欢

转载自blog.csdn.net/qq_28033719/article/details/111873250