算法日志 --- 12.20---到达终点数字

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第27天,点击查看活动详情

今天应该是居家的第三天了,具体是周几已经不记得了

到达终点数字

该题出自力扣的754题 —— 到达终点数字【中等题】

审题

在一根无限长的数轴上,你站在0的位置。终点在target的位置。 你可以做一些数量的移动 numMoves : 每次你可以选择向左或向右移动。 第 i 次移动(从  i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。 给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。

  • 这道题如果太较真,那就不容易做了,其实就是一道选择对称性的题目,给出一个target的变量,返回从0到这个变量所需要的步数,每i次行动就意味着走i步
  • 那么答案有一个最小的下界n,也就是1到n的和必须不小于target,原因是,假如全都取正,总和都达不到target,那么一定不能通过改变某些步骤的方向来达到目的
  • 那么显而易见的,虽然说第i步有可能大于变量target,但是可以选择负数的i,也就是左边
  • 首先target是正是负无所谓,无非就是换方向的问题,因此不妨假设方向是正的。利用Math.abs去计算出距离的绝对值
  • 计算出走到这个距离所需要的步数和距离
  • 当这个结论是偶数时,也就是比如sum-target=4,那么我们把2变成-2,那么sum减小了4。
  • 当这个结论是奇数时,很明显可以再走两步达到目的:第一步向回走,第二步向前走,例如 sum -target = 3,那么就需要进行两步操作,1和2

编码

class Solution {
    public int reachNumber(int target) {
        int t = Math.abs(target);
        int num = 0, sum = 0;
        while (t>sum){
            num++;
            sum+=num;
        }
        int dt = sum - t;
        if ((dt & 1) != 0){
            if ((num & 1) == 0) {
                num++;
            }else {
                num+=2;
            }

        }

        return num;
    }
}

image.png