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;
        }
    
  • 相关阅读:
    泛型接口协变和抗变
    泛型类功能
    泛型结构
    using 关键字给类和名称空间指定别名
    sqlite创建数据库问题
    sqlite命令
    必须输入大于0的整数
    最近在看c#本质论和B站上对应这本书的视频
    Linux系统管理笔记
    创建圆形类,其中包括set,get方法
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/9695448.html
Copyright © 2011-2022 走看看