码迷,mamicode.com
首页 > 其他好文 > 详细

到达一个数 Reach a Number

时间:2018-09-24 16:54:50      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:info   不同的   use   pre   while   方案   节点   空间   each   

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

标签:info   不同的   use   pre   while   方案   节点   空间   each   

原文地址:https://www.cnblogs.com/TIMHY/p/9695448.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!