題目
在一根無限長的數軸上,你站在0的位置。終點在target的位置。
每次你可以選擇向左或向右移動。第 n 次移動(從 1 開始),可以走 n 步。
返回到達終點需要的最小移動次數。
示例 1:
輸入: target = 3
輸出: 2
解釋:
第一次移動,從 0 到 1 。
第二次移動,從 1 到 3 。
示例 2:
輸入: target = 2
輸出: 3
解釋:
第一次移動,從 0 到 1 。
第二次移動,從 1 到 -1 。
第三次移動,從 -1 到 2 。
解析
class Solution {
public:
int reachNumber(int target) {
// 理解這題的意思 這題就好做了
// 分析 首先考慮一種比較極端的情況 即一直向正方向移動n步 ,剛好達到target
// 那么target的值就等於前n步的和 ,也就是1+2+.....+n = n*(n+1)/2
// 如果n(n+1)/2>target ,那么所需要的步數肯定要比n多,而且肯定有向左走的步子,也就是求和的時候肯定是有負數的,至於哪個或者哪些個為負,下面開始討論
//1,n(n+1)/2 - target 為偶數時,所以要想到達 target 需要向左走 n(n+1)/2 - target 偶數步 ,
// 就是把前n項中第( n(n+1)/2 - target)/2 步變為負號就行了
//當n(n+1)/2 - target 為奇數時,就要分類討論了,若n為奇數n+1就是偶數 無論向左還是向右 都不會產生一個奇數的差來因此需要再走一步故要n+2步
//若n為偶數,n+1則為奇數,可以產生一個奇數的差,故要n+1步
if(target<0) return reachNumber(-target) ;
int i=0 ;
while(i*(i+1) < 2*target )
{
i++;
}
if(i*(i+1)/2 == target) return i ;
else
{
if((i*(i+1)/2-target)%2 == 0) return i;
else
{
if(i%2==0) return i+1 ;
else return i+2 ;
}
}
}
};