题目描述
在一根无限长的数轴上,你站在0的位置。终点在target的位置。
每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。
返回到达终点需要的最小移动次数。
示例 1:
1 | 输入: target = 3 |
示例 2:
1 | 输入: target = 2 |
注意:
target是在[-10^9, 10^9]范围中的非零整数。
题解
思路
- 由于对称,所以正负不影响。
- 向右走
step步,直到累加步数sum大于等于目标值。
- 如果
sum == target,返回step。 - 如果
sum > target,其中步数差为sum - target。 - 如果
sum - target是偶数,那么翻转(sum - target)/2的符号即可达成。
例如:sum - target = 4,将 2 符号变为 -2,所以 sum 减少了 4,sum 就与 target 相等。
所以得出公式 $\eqref{eq2}$,走了 step 步并且翻转了 (sum - target)/2 的符号,所以最终返回 step。
- 如果
sum - target是奇数。sum - target + 1即sum - (target - 1)是偶数,根据公式$\eqref{eq2}$ 可以得出
- 如果
step是偶数,且step > sum - target + 1。
从公式 $\eqref{eq3}$ 可以得出
公式 $\eqref{eq4}$ 表示走了 step + 1 步并且翻转了 (sum - target + 1)/2 和 step/2 的符号,所以最终步数为 step + 1。
- 如果
step是奇数。
从公式 $\eqref{eq3}$ 可以得出
公式 $\eqref{eq5}$ 表示走了 step + 2 步,并且翻转了 (sum - target + 1)/2 和 step + 1 的符号,所以最终步数为 step + 2。
代码
1 | int reachNumber(int target) { |
参考链接
- LeetCode 评论, LeetCode.