ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【Leetcode】675. Cut Off Trees for Golf Event

2021-06-03 13:31:06  阅读:202  来源: 互联网

标签:Cut Off cur get int 675 next forest size


题目地址:

https://leetcode.com/problems/cut-off-trees-for-golf-event/

给定一个 m × n m\times n m×n的二维矩阵 A A A, 0 0 0表示障碍物, 1 1 1表示空地,大于 1 1 1的数表示要砍掉的树的高度。一开始从 ( 0 , 0 ) (0,0) (0,0)开始出发,每次只能走到非 0 0 0的位置,并且要按照树的高度从小到大依次走到每一个树将其砍掉。问总共至少要走多少步。如果某棵树走不到,则直接返回 − 1 -1 −1。

可以先将所有的树的位置连同其高度存进一个最小堆,然后依次pop堆顶,接着用BFS求一下从当前位置走到这棵树的最短路,累加步数即可。如果发现走不到,则直接返回 − 1 -1 −1。代码如下:

import java.util.*;

public class Solution {
    public int cutOffTree(List<List<Integer>> forest) {
        int m = forest.size(), n = forest.get(0).size();
        // 第一维存高度,后面两维存树的坐标
        PriorityQueue<int[]> minHeap = new PriorityQueue<>((x, y) -> Integer.compare(x[0], y[0]));
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                int h = forest.get(i).get(j);
                if (h > 1) {
                    minHeap.offer(new int[]{h, i, j});
                }
            }
        }
        
        int res = 0;
        int[] cur = {forest.get(0).get(0), 0, 0};
        while (!minHeap.isEmpty()) {
            int[] next = minHeap.poll();
            int steps = bfs(cur, next, forest);
            if (steps == -1) {
                return -1;
            }
            
            res += steps;
            cur = next;
        }
        
        return res;
    }
    
    private int bfs(int[] cur, int[] next, List<List<Integer>> forest) {
        if (Arrays.equals(cur, next)) {
            return 0;
        }
        
        int m = forest.size(), n = forest.get(0).size();
        int[] d = {1, 0, -1, 0, 1};
        Queue<int[]> queue = new LinkedList<>();
        queue.offer(cur);
        boolean[][] vis = new boolean[m][n];
        vis[cur[1]][cur[2]] = true;
        
        int res = 0;
        while (!queue.isEmpty()) {
            res++;
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                cur = queue.poll();
                for (int j = 0; j < 4; j++) {
                    int nextX = cur[1] + d[j], nextY = cur[2] + d[j + 1];
                    if (0 <= nextX && nextX < m && 0 <= nextY && nextY < n) {
                        if (nextX == next[1] && nextY == next[2]) {
                            return res;
                        }
    
                        int h = forest.get(nextX).get(nextY);
                        if (h >= 1 && !vis[nextX][nextY]) {
                            queue.offer(new int[]{h, nextX, nextY});
                            vis[nextX][nextY] = true;
                        }
                    }
                }
            }
        }
        
        return -1;
    }
}

时间复杂度 O ( k ( m n + log ⁡ k ) ) O(k(mn+\log k)) O(k(mn+logk)),空间 O ( k + m n ) O(k+mn) O(k+mn), k k k是树的个数。

标签:Cut,Off,cur,get,int,675,next,forest,size
来源: https://blog.csdn.net/qq_46105170/article/details/117518070

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有