地址:https://leetcode-cn.com/problems/reach-a-number/
思路:
首先对于target,其正负结果是一样的,其负值就相当于正值走的路径方向相反,因此对其考虑正值
设最少走 n 步,那么首先
s
=
n
∗
(
n
+
1
)
2
⩾
t
a
r
g
e
t
s = \frac{n*(n+1)}{2} \geqslant target
s=2n∗(n+1)⩾target.
则 n=sqrt(2*target);
若 s = target.则 res=n;
若 s < target.则 ++n;
设 向右走了 s1 步,向左走了 s2 步,则
(1) s1 + s2 = s
(2) s1 - s2 = target
则 s1 = (s + target)/2 ,因此 (s + target) 必须为偶数
s2 = s - s1, 那么只要能凑出 s2 就能够使等式(1),(2)成立
而 s 由 1 + 2 + … + n组成,s2 < s,故 s 必能凑成 s2
因此只要使得
s
⩾
t
a
r
g
e
t
,
(
s
+
t
a
r
g
e
t
)
%
2
=
=
0
s \geqslant target, (s + target) \%2 == 0
s⩾target,(s+target)%2==0 成立即可
Code:
class Solution {
public:
int reachNumber(int target) {
if(target<0) target*=-1;
int res=sqrt(2*target);
if(res*(res+1)/2<target) ++res;
while((res*(res+1)/2+target)%2){
++res;
}
return res;
}
};