解题思路:
刚看到这道题,顿时想到了BFS,直接上模板,代码如下:
class Solution {
public:
int reachNumber(int target) {
queue<int> q;
q.push(0);
int step = 0;
while(!q.empty()) {
step ++;
int len = q.size();
for(int i = 0; i < len; i ++) {
int site = q.front();
q.pop();
int site1 = site + step;
int site2 = site - step;
if(site1 == target || site2 == target) {
return step;
}
q.push(site1);
q.push(site2);
}
}
return step;
}
};
很显然出错了,因为做了太多了无意义的计算,所以我们要从推理的角度出发,首先无论target的正负,都是相同的步骤到达,无非是另一个步骤反过来了而已,所以先把target取绝对值,然后不断加,直到超过target或者正好到达,如果sum与target的差值为偶数,那么只要将中间的step/2取反就好,如果是奇数,很明显可以通过step走到target-1,那么往回走一步再向前走一步就能到达,即step+2,但如果step为偶数,那么向前走k+1与target的差值为偶数,那么中间(k+1+dist)/2取反就好,这样为step+1步,代码如下:
class Solution {
public:
int reachNumber(int target) {
target = abs(target);
int step = 0;
int sum = 0;
while(sum < target) {
step ++;
sum += step;
}
int dist = sum - target;
if(dist % 2 == 0) return step;
else {
if(step % 2 == 0) return step + 1;
else return step + 2;
}
}
};