zoukankan      html  css  js  c++  java
  • LeetCode 1345. Jump Game IV(BFS)

    题目

    双周赛最后一题

    题意:从起始点开始走,每次只能往前走一步,或者往后走一步,或者直接跳到数值一样的格子。求跳到最后一个格子的最小步数

    题解: 一开始以为是动态规划,后来发现用BFS更加简单。动态规划也是可以解的。

    struct Node
    {
        int pos;
        int num;
        Node(){}
        Node(int pos,int num)
        {
            this->pos = pos;
            this->num = num;
        }
    };
    class Solution {
    public:
        map<int,vector<int>> m;
        int vis[50005];
        int minJumps(vector<int>& arr) {
            
            for(int i=1;i<arr.size();i++)
            {
                vis[i]=99999999;
                m[arr[i]].push_back(i);
            }
            
            queue<Node> q;
            int ans=0;
            q.push(Node(0,0));
            vis[0]=0;
            
            while(!q.empty())
            {
                Node term = q.front();
                q.pop();
                
                if(term.pos==arr.size()-1)
                    ans = term.num;
                //往后走一步
                if(term.pos>0)
                {
                    if(vis[term.pos-1]>term.num+1)
                    {
                        q.push(Node(term.pos-1,term.num+1));
                        vis[term.pos-1]=term.num+1;
                    }
                }
                
                //往前走一步
                if(vis[term.pos+1]>term.num+1)
                {
                    q.push(Node(term.pos+1,term.num+1));
                    vis[term.pos+1]=term.num+1;
                }
                
                //相同数值的位置
                for(int i=0;i<m[arr[term.pos]].size();i++)
                {
                    if(m[arr[term.pos]][i]==term.pos)
                        continue;
                   
                    if(vis[m[arr[term.pos]][i]]>=term.num+1)
                    {
                        q.push(Node(m[arr[term.pos]][i],term.num+1));
                        vis[m[arr[term.pos]][i]] = term.num+1;
                    }
                    else
                        break;//防止之后再次循环,超时。
                }
                
            }
            return ans;
            
        }
    
    };
    
  • 相关阅读:
    <转>ajax 同步异步问题
    Jquery中父,子页面之间元素获取及方法调用
    python基础知识
    python数据类型
    sed,awk
    zabbix 4.0版本
    Redis 5.0
    ansible
    MariaDB集群配置(主从和多主)
    读写分离
  • 原文地址:https://www.cnblogs.com/dacc123/p/12288316.html
Copyright © 2011-2022 走看看