數學規律
難度:中等
推薦學習視頻:花花醬
class Solution {
public:
int reachNumber(int target) {
// t = k*(k+1)/2 => k = sqrt(2*t) 2020.2.27 數學規律
//優先找到平方根附近的數 然後計算目標值與實際值的差值d 如果d是偶數
//說明不需要只需要在走的過程中來了沒必要的折返d/2 就抵消了這個距離d
//如果是奇數 說明至少還需要多走一步 如果是結束的step是偶數 那麼下一次step+1爲奇數就能湊出一個偶數來形成折返 如果step是奇數 說明還需再多走一步 step+1是偶數 step+2是奇數
target = abs(target);
int k = sqrt(target*2);
while(sum(k) < target) k++;
int d = sum(k) - target;
if(d%2 == 0) return k;
return k+1+(k%2);
}
private:
int sum(int n){
return n*(n+1)/2;
}
};