754. 到达终点数字
754. 到达终点数字
在一根无限长的数轴上,你站在0的位置。终点在target的位置。
你可以做一些数量的移动 numMoves :
每次你可以选择向左或向右移动。
第 i 次移动(从 i == 1 开始,到 i == numMoves ),在选择的方向上走 i 步。
给定整数 target ,返回 到达目标所需的 最小 移动次数(即最小 numMoves ) 。
示例 1:
- 输入: target = 2
- 输出: 3
- 解释:
- 第一次移动,从 0 到 1 。
- 第二次移动,从 1 到 -1 。
- 第三次移动,从 -1 到 2 。
BFS
碰到这种求最值问题很容易想到用bfs去做。
class Solution {
public:
queue<pair<int,int>>qu;
int reachNumber(int target) {
qu.push({0,1});
while(qu.front().first!=target&&!qu.empty()){
pair<int,int>node=qu.front();
//cout<<node.first<<" "<<node.second<<endl;
qu.pop();
qu.push({node.first+node.second,node.second+1});
qu.push({node.first-node.second,node.second+1});
}
return qu.front().second-1;
}
};
-10^9 <= target <= 10^9 很显然会超时
数学+规律
分两种情况考虑
- 向左或者向右走K步,恰好sum=target,此时直接返回步数即可
- 向左或向右走K步,超过了target。
超过的情况又分为两种
- 超过偶数
- 超过奇数
当超过步数为偶数时,我们可以通过将路程中的某一步折法,来消除差数。例如超过2步,就将1折返一次即可
当超过步数为奇数时,继续移动至满足超过为偶数即可
class Solution {
public:
queue<pair<int,int>>qu;
int reachNumber(int target) {
target=abs(target);
int sum=0,res=0;
while(sum<target||(sum-target)%2!=0){
sum += ++res;
}
return res;
}
};

浙公网安备 33010602011771号