到达一个数 Reach a Number

Posted hyserendipity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了到达一个数 Reach a Number相关的知识,希望对你有一定的参考价值。

2018-09-24 14:19:58

问题描述:

问题求解:

初看到这个问题,直觉上认为可以通过BFS遍历解空间进行求解,因为本质上来说,这个问题和棋盘上移动马的问题是一类问题,都是可以转化成图的问题,但是MLE了,问题出在在本问题中是不能使用used来保存已经扩展过的节点的,因为相同的节点在不同的阶段的移动步数是不一样的,因此都需要进行入队列的操作。

当然,看到数据规模就应该有意识,这个问题是不能使用暴力搜索来求解的。

事实上,这个问题是一个数学问题,求解方案是:

1)首先负数和其相反数的步数是相同的,因此只需要考虑正数的个数;

2)对于一个正数,我们最先需要做的就是通过最短的步骤到达或将将超过这个target;

3)如果正好达到target,或者diff为一个偶数,那么我们可以直接返回step,因为如果diff为偶数,可以将前面的+改变成-实现和为target;

4)问题就是如果diff为奇数,那么就需要继续往后加,直到diff为偶数

    public int reachNumber(int target) {
        target = Math.abs(target);
        int sum = 0;
        int step = 0;
        while (sum < target) {
            step++;
            sum += step;
        }
        while ((sum - target) % 2 != 0) {
            step++;
            sum += step;
        }
        return step;
    }

 

以上是关于到达一个数 Reach a Number的主要内容,如果未能解决你的问题,请参考以下文章

(Easy) Reach a Number - LeetCode

[LeetCode] Reach a Number 达到一个数字

[GeeksForGeeks] Count Number of ways to reach a given score in a game

LeetCode 0754. 到达终点数字

dad的意思

UVa11882 Biggest Number (DFS+剪枝)