链接
题目
在一根无限长的数轴上,你站在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 。
说明
-10e9 <= target <= 10e9
target != 0
思路
- 1. 题目可以转化为 1 ± 2 ± 3 ...... ± k,确定每个数字前面的符号,使得总和为target且k最小
- 2. 这里如果target为负数,可以转成其相反数,相当于-(1 ± 2 ± 3 ...... ± k),所有符号都变号,不影响最终结果。
- 3. 设所有正数的和为N,负数的和为-P,则有N+P=S,N-P=target
- 4. 两式相减可得,2P=S-target,这里P可以为任意数,S=(k*(k+1))/2,S-target为偶数
- 5. 因此,这题就变成了找最小的k,使得S-target为偶数,这里S-target还得是正的。
C++ Code
class Solution{
public:
int reachNumber(int target){
if(target<0) target=-target;
int k=1;
while(true)
{
int S=(k+1)*k/2;
if(S-target>=0&&(S-target)%2==0) return k;
k++;
}
return 0;
}
};