跳跃游戏IV

从0位置跳到末位置,每次可以往左跳、往右跳一格,或跳到有与该位置相同数值的地方,求最小跳跃次数

1. 广度优先搜索+哈希预处理+动态规划

class Solution {
public:
    vector<int> dp;//dp[i]表示到达i位置最小操作数
    int minJumps(vector<int>& arr) {
        int n =arr.size();
        map<int,vector<int>> m;
        for(int i=0;i<n;i++)
            m[arr[i]].push_back(i);//存储对应值的坐标

        dp.resize(n,INT_MAX);
        queue<int> q;
        q.push(0);
        int depth = 0;
        while(!q.empty()){
            if(dp[n-1]!=INT_MAX) return dp[n-1];//剪枝
            int k = q.size();
            for(int i=0;i<k;i++){
                int cur = q.front();
                q.pop();
                if(cur<0||cur>=n) continue;//跳过越界
                if(dp[cur]<=depth) continue;//跳过重复
                dp[cur] = depth;
                //接下来把能加入的坐标加入
                q.push(cur+1);
                q.push(cur-1);
                if(!m.count(arr[cur])) continue;//没有相同值,表示已经被扫描过了
                for(int j=0;j<m[arr[cur]].size();j++)
                    q.push(m[arr[cur]][j]);
                 m.erase(arr[cur]);
            }
            depth++;//下一层操作数加一
        }
        return dp[n-1];
    }
};
posted @ 2023-05-10 22:39  失控D大白兔  阅读(6)  评论(0编辑  收藏  举报