zoukankan      html  css  js  c++  java
  • 到达一个数 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;
        }
    
  • 相关阅读:
    去深圳办理港澳通行证签注延期
    預約申領往來港澳通行證及簽注x
    表格选中效果展示
    Purchase购物车实例分析
    IOS开发基础知识--碎片17
    IOS开发基础知识--碎片16
    IOS开发基础知识--碎片15
    IOS开发基础知识--碎片14
    IOS关于LKDBHelper实体对象映射插件运用
    IOS开发基础知识--碎片13
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/9695448.html
Copyright © 2011-2022 走看看