754. 到达终点数字
题目描述
在一根无限长的数轴上,你站在0
的位置。终点在target
的位置。
你可以做一些数量的移动 numMoves
:
- 每次你可以选择向左或向右移动。
- 第
i
次移动(从i == 1
开始,到i == numMoves
),在选择的方向上走i
步。
给定整数 target
,返回 到达目标所需的 最小 移动次数(即最小 numMoves
) 。
示例 1:
输入: target = 2 输出: 3 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 -1 。 第三次移动,从 -1 到 2 。
示例 2:
输入: target = 3 输出: 2 解释: 第一次移动,从 0 到 1 。 第二次移动,从 1 到 3 。
提示:
-109 <= target <= 109
target != 0
解法
方法一:数学分析
由于对称性,每次可以选择向左或向右移动,因此,我们可以将 \(\textit{target}\) 统一取绝对值。
定义 \(s\) 表示当前所处的位置,用变量 \(k\) 记录移动的次数。初始时 \(s\) 和 \(k\) 均为 \(0\)。
我们将 \(s\) 一直循环累加,直到满足 \(s\ge \textit{target}\) 并且 \((s-\textit{target}) \bmod 2 = 0\),此时的移动次数 \(k\) 就是答案,直接返回。
为什么?因为如果 \(s\ge \textit{target}\) 且 \((s-\textit{target})\mod 2 = 0\),我们只需要把前面 \(\frac{s-\textit{target}}{2}\) 这个正整数变为负数,就能使得 \(s\) 与 \(\textit{target}\) 相等。正整数变负数的过程,实际上是将移动的方向改变,但实际移动次数仍然不变。
时间复杂度 \(O(\sqrt{\left | \textit{target} \right | })\),空间复杂度 \(O(1)\)。
1 2 3 4 5 6 7 8 9 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|