版权声明:本文为博主原创文章,博客地址:https://blog.csdn.net/qq_41855420,未经博主允许不得转载。 https://blog.csdn.net/qq_41855420/article/details/89814503
问题描述:
在一根无限长的数轴上,你站在0的位置。终点在target的位置。
每次你可以选择向左或向右移动。第 n 次移动(从 1 开始),可以走 n 步。
返回到达终点需要的最小移动次数。
示例 1:
输入: target = 3
输出: 2
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 3 。
示例 2:
输入: target = 2
输出: 3
解释:
第一次移动,从 0 到 1 。
第二次移动,从 1 到 -1 。
第三次移动,从 -1 到 2 。
target是在[-10^9, 10^9]范围中的非零整数。
首先要明确target不管是是正数还是负数进行的处理都是一样的,唯一的不同就是所有的移动方向都相反,比如1-2+3=2和-1+2-3=-2步数一样,只是所有的方向相反。
通过观察思考,我们可以得出:-1和1相差2,-2和2相差4,依此类推······我们就拥有了2~2n(步数为n)所有的偶数。
假如我们每一步都走正值的话,直到步数之和sum > target为止,然后判断sum - target,如果为偶数的话,我们就可以通过调整前面几步的方向来抵消这个数,所以步数为n。蛋式,如果sum - target
为奇数呢?我们只能继续往下再走,再判断sum - target
是否为偶数。
class Solution {
public:
int reachNumber(int target) {
target = abs(target);
int n = 0, sum = 0;
//直到出现sum == target或者sum - target 为偶数
while(sum < target || (sum-target) % 2 != 0) {
++n;
sum += n;
}
return n;
}
};