在一根无限长的数轴上,你站在0的位置。终点在target的位置
你可以做一些数量的移动 numMoves :
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。
示例 1:
输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。
示例 2:
输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。
解题思路:
该题主要难点在于逻辑的理解。找到第一个使num=1+2+......+i>=target且num-target为偶数的 i。
由于对称性,target是正是负影响不大,首先将所有target为负的情况转换为target为正的情况;
一直向右走,直到所在位置超过target,此时num=1+2+...+i;
计算多走出了几个位置:a=num-target。那么我们就要使前面走的某一步x反向,使num变为:num'=num-a=target=1+2+...-x+...+i。可以看到num'其实是在num的基础上减了2个x(先向左走x后又向右补上x),即a=2x=num-target,所以num-target必须为偶数;
所以我们只需要找到第一个使num=1+2+...+i>target且num-target为偶数的k即为答案
- int reachNumber(int target){
- target=abs(target);
- int i=0;
- int num=0;
- while(num
2!=0) - {
- i++;
- num+=i;
- }
- return i;
- }