题目地址:
https://www.lintcode.com/problem/reach-a-number/description
给定一个数轴,可以从 0 0 0出发,第 i i i次移动可以向左或者向右移动 i i i个单位。再给定一个非零的target。问这个target至少需要多少步可以到达。
由于数轴是对称的,所以不妨只考虑target是正数。
如果存在
n
n
n使得
1
+
2
+
.
.
.
+
n
=
t
a
r
g
e
t
1+2+...+n=target
1+2+...+n=target,那么显然答案就是
n
n
n。
否则的话,我们考虑
1
+
2
+
.
.
.
+
n
1+2+...+n
1+2+...+n第一次超过
t
a
r
g
e
t
target
target的时候。很显然这时候
n
−
1
n-1
n−1步是不可能到达
t
a
r
g
e
t
target
target的。如果
1
+
2
+
.
.
.
+
n
−
t
a
r
g
e
t
1+2+...+n-target
1+2+...+n−target是偶数,比如说是
r
r
r,那么将前面的
r
/
2
r/2
r/2这个数反个号,得到的和就正好是
t
a
r
g
e
t
target
target了,所以此时也是至少需要
n
n
n步。
上面两个情况可以总结起来得到,如果
1
+
2
+
.
.
.
+
n
−
t
a
r
g
e
t
1+2+...+n-target
1+2+...+n−target是偶数,其中
1
+
2
+
.
.
.
+
n
−
1
<
t
a
r
g
e
t
1+2+...+n-1<target
1+2+...+n−1<target,则至少需要
n
n
n步。
接下来考虑
1
+
2
+
.
.
.
+
n
−
t
a
r
g
e
t
1+2+...+n-target
1+2+...+n−target是奇数的情况,那么必须要走接下来的这
n
+
1
n+1
n+1步,容易看出,走完第
n
+
1
n+1
n+1步后,所在的位置和
t
a
r
g
e
t
target
target的差的奇偶性是确定的。
如果
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target是偶数
r
r
r,那么同样地将
r
/
2
r/2
r/2反个号,这个和就等于target了,所以当
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target是偶数的时候,至少需要
n
+
1
n+1
n+1步;
否则如果
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target还是奇数,那么
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
+
(
n
+
2
)
−
t
a
r
g
e
t
1+2+...+n+(n+1) + (n+2)-target
1+2+...+n+(n+1)+(n+2)−target必然是偶数设为
r
r
r(因为
1
+
2
+
.
.
.
+
n
−
t
a
r
g
e
t
1+2+...+n-target
1+2+...+n−target是奇数,如果
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target还是奇数,那说明
n
+
1
n+1
n+1是偶数,所以
n
+
2
n+2
n+2是奇数,所以
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
+
(
n
+
2
)
−
t
a
r
g
e
t
1+2+...+n+(n+1) + (n+2)-target
1+2+...+n+(n+1)+(n+2)−target必然是偶数),这时也是将
r
/
2
r/2
r/2反个号就行了,所以至少需要
n
+
2
n+2
n+2步。简略证明一下
n
+
2
n+2
n+2确实是下界。首先由于
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target是奇数,说明
1
+
2
+
.
.
.
+
n
+
(
n
+
1
)
−
t
a
r
g
e
t
1+2+...+n+(n+1)-target
1+2+...+n+(n+1)−target的加号里无论把哪些加号变为减号,和也是奇数,也就是非
0
0
0,说明
n
+
1
n+1
n+1步是不够的。所以
n
+
2
n+2
n+2是个下界。
代码如下:
import java.util.Map;
public class Solution {
/**
* @param target: the destination
* @return: the minimum number of steps
*/
public int reachNumber(int target) {
// Write your code here
// i是步数,也是每步的步长;sum是位置
int i = 0;
int sum = 0;
target = Math.abs(target);
while (sum < target) {
sum += ++i;
}
if ((sum - target) % 2 == 0) {
return i;
} else {
if ((sum + i + 1 - target) % 2 == 0) {
return i + 1;
} else {
return i + 2;
}
}
}
}
时间复杂度 O ( n ) O(\sqrt{n}) O(n),空间 O ( 1 ) O(1) O(1)。