LeetCode 到达终点数字

版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/89814503
问题描述:

在一根无限长的数轴上,你站在0的位置。终点在target的位置。

每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。

返回到达终点需要的最小移动次数。

示例 1:
输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。
示例 2:
输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。

: \color{red}{注意:}

target是在[-10^9, 10^9]范围中的非零整数。

: \color{blue}{思路分析:} 首先要明确target不管是是正数还是负数进行的处理都是一样的,唯一的不同就是所有的移动方向都相反,比如1-2+3=2和-1+2-3=-2步数一样,只是所有的方向相反。

通过观察思考,我们可以得出:-1和1相差2,-2和2相差4,依此类推······我们就拥有了2~2n(步数为n)所有的偶数。

假如我们每一步都走正值的话,直到步数之和sum > target为止,然后判断sum - target,如果为偶数的话,我们就可以通过调整前面几步的方向来抵消这个数,所以步数为n。蛋式,如果sum - target为奇数呢?我们只能继续往下再走,再判断sum - target是否为偶数。

class Solution {
public:
    int reachNumber(int target) {
        target = abs(target);
        int n = 0, sum = 0;
        //直到出现sum == target或者sum - target 为偶数
        while(sum < target || (sum-target) % 2 != 0) {
            ++n;
            sum += n;
        }
        return n;
    }
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/89814503