zoukankan      html  css  js  c++  java
  • 1162. As Far from Land as Possible

    package LeetCode_1162
    
    import java.util.*
    
    /**
     * 1162. As Far from Land as Possible
     * https://leetcode.com/problems/as-far-from-land-as-possible/
     * Given an n x n grid containing only values 0 and 1, where 0 represents water and 1 represents land,
     * find a water cell such that its distance to the nearest land cell is maximized, and return the distance.
     * If no land or water exists in the grid, return -1.
    The distance used in this problem is the Manhattan distance: the distance between two cells (x0, y0) and (x1, y1) is |x0 - x1| + |y0 - y1|.
    Example 1:
    Input: grid = [
    [1,0,1],
    [0,0,0],
    [1,0,1]]
    Output: 2
    Explanation: The cell (1, 1) is as far as possible from all the land with distance 2.
     * */
    class Solution {
        /*
        * solution: BFS, save all land in queue then start bfs to increasing the distance for each position,
        * Time complexity:O(mn), Space complexity:O(mn)
        * */
        fun maxDistance(grid: Array<IntArray>): Int {
            if (grid == null || grid.isEmpty()) {
                return -1
            }
            var result = 0
            val m = grid.size
            val n = grid[0].size
            val queue = LinkedList<Pair<Int, Int>>()
            val visited = Array(m) { BooleanArray(n) }
            val directions = intArrayOf(0, 1, 0, -1, 0)
            for (i in 0 until m) {
                for (j in 0 until n) {
                    if (grid[i][j] == 1) {
                        //put the location of land in queue
                        visited[i][j] = true
                        queue.offer(Pair(i, j))
                    }
                }
            }
            while (queue.isNotEmpty()) {
                val size = queue.size
                for (i in 0 until size) {
                    val cur = queue.poll()
                    val x = cur.first
                    val y = cur.second
                    for (d in 0 until 4) {
                        val newX = x + directions[d]
                        val newY = y + directions[d + 1]
                        if (newX < 0 || newX >= m || newY < 0 || newY >= n || visited[newX][newY]) {
                            continue
                        }
                        visited[newX][newY] = true
                        //update the new distance
                        grid[newX][newY] = grid[x][y] + 1
                        result = Math.max(result, grid[newX][newY])
                        queue.offer(Pair(newX, newY))
                    }
                }
            }
            //-1 is for do one more useless loop in bfs
            return result - 1
        }
    }
  • 相关阅读:
    python冲刺(5)列表声称式
    python冲刺(4)切片 等
    python冲刺(3)函数 等
    python冲刺(2)
    python冲刺(1)
    redis初步(1)
    php连接Oracle的时候遇到的编码集问题
    redis初步
    php 命名空间
    指向字符数组的指针与指向整型数组的指针
  • 原文地址:https://www.cnblogs.com/johnnyzhao/p/14050541.html
Copyright © 2011-2022 走看看