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;
    }
};
posted @ 2022-11-04 14:53  认真游泳的鱼  阅读(27)  评论(0)    收藏  举报