到达一个数 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;
    }

 

posted @ 2018-09-24 14:32  hyserendipity  阅读(264)  评论(0编辑  收藏  举报