leetcode 754. 到达终点数字

 

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

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

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

示例 1:

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

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

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reach-a-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

累计求和 + 判断差值的奇偶性

1:因为从1开始,每一次都走n步,直到到达target,此题的思路可转换为:

在 1,2,3,4,..., n 之间添加加号或者减号,使得结果为target, 并使n取得最小值。

2:先不考虑正负,都先按照整数来,因为是对称的,所以正负数的结果是一样的。

3:则先把1到n都选择加号,求和为sum,

若是sum == target, 则直接返回n,为所求

若是sum < target, 则继续计算。

若是sum > target, 说明1到n之间的某几个数字(例如 x)应该为减号:

现在是 +x, 若想达到结果,则需要 - 2 * x , 所以必有sum - target 的差值为偶数。

4:所以只需要返回sum - target为偶数时的n即可。

 

    public int reachNumber(int target) {
        int i = 1;
        int sum = 0;
        target = target < 0 ? ~target + 1 : target;
        while (true) {
            sum += i;
            if (target <= sum && ((sum - target) & 1) == 0){
                return i;
            }
            i++;
        }
    }

 

posted @ 2021-09-25 15:29  旺仔古李  阅读(61)  评论(0编辑  收藏  举报