美团2024春招第9场算法第二题

测试用例

3 3

1 2 3

3 4 5

4 3 6

目标答案:19

最短路问题

考虑使用dijkstra

import java.io.StreamTokenizer;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.PriorityQueue;

public class mt2 {
    static int n,m;
    static StreamTokenizer stk = new StreamTokenizer(new java.io.BufferedReader(new java.io.InputStreamReader(System.in)));

    static int[][] graph = new int[1050][1050];
    static boolean[][] vis = new boolean[1050][1050];
    //构建一个点图
    static int getInt(){
        try{
            stk.nextToken();
            return (int)stk.nval;
        }catch(Exception e){
            return -1;
        }
    }

    public static void main(String[] args) {
        n = getInt();
        m = getInt();
        for(int i = 1; i <= n; i++){
            for(int j = 1; j <= m; j++){
                graph[i][j] = getInt();
            }
        }
        node end = new node((1+n)/2, (1+m)/2, graph[(1+n)/2][(1+m)/2]);//在中点相见
        long sum = 0;
        node start = new node(1,1,graph[1][1]);
        sum += dijkstra(start,end);
        start = new node(n,m,graph[n][m]);
        sum += dijkstra(start,end);
        System.out.println(sum - graph[(1+n)/2][(1+m)/2]);//因为中心点会被同时算两次,去重
    }
    static class node{
        int x;
        int y;
        int value;
        public node(int x, int y, int value){
            this.x = x;
            this.y = y;
            this.value = value;
        }
    }
    static long dijkstra(node start,node end){{
        long sum = start.value;
            PriorityQueue<node> pq = new PriorityQueue<>((a,b)->b.value-a.value);
            pq.add(start);
            while(!pq.isEmpty()){
                node now = pq.poll();
                if(now.x == end.x && now.y == end.y) break;//检查是否到达终点
                if(vis[now.x][now.y])continue;
                vis[now.x][now.y] = true;//标记访问
                int[][] path = {{0,1},{0,-1},{1,0},{-1,0}};//上下左右
                int x = now.x;
                int y = now.y;
                long max = Integer.MIN_VALUE;
                long max_value = 0;
                for(int i = 0; i < 4;i++){
                    int idx = x + path[i][0];
                    int idy = y + path[i][1];
                    if(max < graph[idx][idy] + sum){//如果当前点+总和大于最大值,则更新最大值
                        max = graph[idx][idy] + sum;
                        if(!vis[idx][idy]){
                            max_value = graph[idx][idy];//保存当前点的值,必须是未访问过的
                        pq.add(new node(idx,idy,graph[idx][idy]));//添加进队列中
                        }
                    }
                }

                sum += max_value;
            }
            return sum;
    }
    }
}

关于dijkstra堆优

static void Dijkstra(int s){//堆优化版本
        Arrays.fill(dist,Integer.MAX_VALUE);
        dist[s] = 0;
        //压入格式为{v,w}
        PriorityQueue<node> que = new PriorityQueue<>((a,b) -> a.weight - b.weight);//从小到大使用优先队列

        que.offer(new node(s,0));

        while(!que.isEmpty()){
            node now_point = que.poll();
            int u = now_point.ponit;
            int w = now_point.weight;
            if(vis[u]) continue;//将该点置为已访问
            vis[u] = true;
            //遍历该点的所有邻接点
            for(int i = head[u]; i != -1; i = edges[i].next){;
                int v = edges[i].to;//到达点
                //如果dist[到达点] > 当前点的最短距离+到达下一个点的距离 置换
                if(dist[v] > w + edges[i].weight){
                    dist[v] = w + edges[i].weight;
                    if(!vis[v]){
                        que.offer(new node(v,dist[v]));
                    }
                }
            }
        }
    }

已经写的很详细了,不在赘述

#美团2024春招#
全部评论
动态规划可以吗?
点赞
送花
回复 分享
发布于 05-11 16:28 安徽

相关推荐

👥&nbsp;面试题目1&nbsp;&nbsp;请先做一下自我介绍(大概两分钟左右的自我介绍环节)2&nbsp;&nbsp;请讲一下你的实习工作内容(本人实习内容主要是编写MySQL表,实现多表关联)3.1&nbsp;&nbsp;MySQL有实现过多表查询吗3.2&nbsp;&nbsp;讲一下是如何实现的4&nbsp;&nbsp;现在你要编写一个MySQL表,内容是存储员工的基本信息包括年龄,性别,身份证信息等,第一种方法是选择身份证号作为主键,第二种方法是选择一个自增的列作为主键,请分别说明一下两种方法的优劣势,并说明一下如果是你在实际工作中遇到这种问题会如何选择5&nbsp;&nbsp;谈一谈你对进程的理解(从进程和线程区别的角度入手)6.1&nbsp;&nbsp;对线程池有了解吗6.2&nbsp;&nbsp;请说一下使用线程池和使用new语句的区别6.3&nbsp;&nbsp;知道配置线程池的基本语法吗?请大概说一下7&nbsp;&nbsp;我看你的项目经历中有使用过servlet框架,可以简单介绍一下servlet框架吗8.1&nbsp;&nbsp;对spring&nbsp;boot框架有过了解吗8.2&nbsp;&nbsp;可以说说spring&nbsp;boot和spring的区别吗8.3&nbsp;&nbsp;xml文件是干什么用的呢9&nbsp;&nbsp;你有什么想问我的吗🤔&nbsp;面试感受本次面试是腾讯会议形式的线上面试,全程三十分钟左右面试官是个南方口音的小哥哥,语气非常温柔,很有亲和力,面试前还很紧张的,面试过程中听到小哥哥的声音瞬间觉得没那么紧张了面试内容主要以工作经历和项目经历为主,很少问八股文(也可能因为我是春招补录)个人感觉作为一个普通211的本科生来说,应对大厂面试还是很不够的,尤其在近一年都在准备考研的情况下,确实没有很亮眼的项目和工作经历可以拿的出手&nbsp;希望在读研期间能丰富自己的项目经历最后面试官也很亲切的给出了对我的建议,对于大厂来说,工作经历和项目经历是最重要的两部分,一定要丰富自己在这两方面的经历,面试官也指出在完成项目的过程中,不能只注重实际操作的部分(例如JAVA语法,sql语法等)还要熟悉这些操作底层的工作逻辑,只有这样才能在面对复杂的需求时,有理有据的给出自己的解决方案 #面经#
查看13道真题和解析
点赞 评论 收藏
分享
头像
春招 部门:财务1.&nbsp;部门介绍,自我介绍2.&nbsp;手撕:最长公共子字符串、&nbsp;lambda表达式输出list中元素大于等于80的数的个数、&nbsp;给出字符串比较代码问输出true还是false&nbsp;并说为什么、&nbsp;SQL题多表查询输出学生分数总和大于200的学生信息&nbsp;提问环节:只记录记得的顺序可能不一样3.&nbsp;java是怎么实现一次编译到处运行的4.&nbsp;双亲委派机制5.&nbsp;捕获异常catch&nbsp;里写return&nbsp;finally的代码会执行吗,finally一般写些什么6.&nbsp;文件的io流&nbsp;执行完方法&nbsp;不就自动回收对象了吗为什么还要去关闭流?7.&nbsp;hashmap底层原理,什么时候扩容,为什么线程不安全,会有什么并发问题,concurrenthashmap底层原理8.&nbsp;threadlocal&nbsp;了解吗,有哪些应用场景9.&nbsp;线程池参数,提交任务执行流程10.&nbsp;session&nbsp;cookie&nbsp;token&nbsp;有什么区别,怎么知道前端传入的&nbsp;token&nbsp;是否有效11.&nbsp;限流算法有哪些,漏桶算法原理。12.&nbsp;拿一个身份信息去请求多个不同服务的积分接口,需要快速算出平均积分,你会如何实现(场景题&nbsp;大概是这个意思)11.&nbsp;了解哪些设计模式,用过哪些12.&nbsp;Spring的单例模式如何实现的&nbsp;13.&nbsp;Springboot&nbsp;的start&nbsp;14.&nbsp;缓存击穿了解吗15.&nbsp;数据库索引设计一般如何考虑,模糊匹配走索引吗,联合索引&nbsp;条件查询一个其中字段呢16.&nbsp;公平锁和非公平锁目前就记得这些了~ 时间:5.10&nbsp;20:00耗时:85min手撕是撕出来了但是代码依托,问题回答太墨迹了,采集落泪😢更新:不出所料挂了
美团一面943人在聊 查看16道真题和解析
点赞 评论 收藏
分享
点赞 2 评论
分享
牛客网
牛客企业服务