LeetCode 754. 到达终点数字(数学推理)

1. 题目

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

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

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

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

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

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

2. 解题

  • 正号数字之和为p, 负号数字之和为n,数组之和为s
  • p + n = s p + n = s p+n=s
  • 我们走的有效路程为 p − n = t a r g e t p - n = target pn=target
  • 两式相减 s − t a r g e t = 2 ∗ n s - target = 2 * n starget=2n
  • 可见 s − t a r g e t s - target starget 一定为偶数,且 s − t a r g e t = 2 ∗ n > = 0 s - target = 2 * n >= 0 starget=2n>=0
  • 由等差数列公式有 s = i ∗ ( i + 1 ) / 2 s = i *(i + 1) /2 s=i(i+1)/2
  • 求最小的 i i i, 使得 i ∗ ( i + 1 ) / 2 − t a r g e t i *(i + 1) /2 - target i(i+1)/2target 为 偶数 且 >=0
class Solution {
public:
    int reachNumber(int target) {
        int i = 1;
        target = abs(target);
        int x = (i*i+i)/2-target;
        while(x < 0 || x%2 == 1)
        {
        	++i;
        	x = (i*i+i)/2-target;
        }
        return i;
    }
};

在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页