764. Largest Plus Sign

Il testo del problema è tradotto dal russo per la lingua selezionata. Il codice resta invariato.

Вам given intero n. У вас есть бинарная сетка размером n x n, в которой все значения изначально равны 1, за исключением некоторых индексов, указанных в arrayе mines. element arrayа mines с индексом i определяется как mines[i] = [xi, yi], где grid[xi][yi] == 0.

return порядок самого большого крестообразного знака из 1, выровненного по осям, который содержится в сетке. Если такого знака нет, return 0.

Крестообразный знак из 1 порядка k имеет некоторый центр grid[r][c] == 1, а также четыре луча длиной k - 1, идущих вверх, вниз, влево и вправо, состоящие из 1. Обратите внимание, что за пределами лучей креста могут быть 0 или 1, проверяется только соответствующая область крестообразного знака на наличие 1.

Esempio:

Input: n = 5, mines = [[4,2]]

Output: 2

Explanation: In the above grid, the largest plus sign can only be of order 2. One of them is shown.

C# soluzione

abbinato/originale
public class Solution {
    public int OrderOfLargestPlusSign(int N, int[][] mines) {
        var banned = new HashSet<int>();
        foreach (var mine in mines) {
            banned.Add(mine[0] * N + mine[1]);
        }
        
        int ans = 0;
        for (int r = 0; r < N; ++r) {
            for (int c = 0; c < N; ++c) {
                int k = 0;
                while (k <= r && r < N - k && k <= c && c < N - k &&
                      !banned.Contains((r - k) * N + c) &&
                      !banned.Contains((r + k) * N + c) &&
                      !banned.Contains(r * N + c - k) &&
                      !banned.Contains(r * N + c + k)) {
                    k++;
                }
                ans = Math.Max(ans, k);
            }
        }
        return ans;
    }
}

C++ soluzione

bozza automatica, rivedere prima dell'invio
#include <bits/stdc++.h>
using namespace std;

// Auto-generated C++ draft from the C# solution. Review containers, LINQ and helper types before submit.
class Solution {
public:
    public int OrderOfLargestPlusSign(int N, int[][] mines) {
        var banned = new HashSet<int>();
        foreach (var mine in mines) {
            banned.push_back(mine[0] * N + mine[1]);
        }
        
        int ans = 0;
        for (int r = 0; r < N; ++r) {
            for (int c = 0; c < N; ++c) {
                int k = 0;
                while (k <= r && r < N - k && k <= c && c < N - k &&
                      !banned.Contains((r - k) * N + c) &&
                      !banned.Contains((r + k) * N + c) &&
                      !banned.Contains(r * N + c - k) &&
                      !banned.Contains(r * N + c + k)) {
                    k++;
                }
                ans = max(ans, k);
            }
        }
        return ans;
    }
}

Java soluzione

abbinato/originale
class Solution {
    public int orderOfLargestPlusSign(int N, int[][] mines) {
        Set<Integer> banned = new HashSet<>();
        for (int[] mine : mines)
            banned.add(mine[0] * N + mine[1]);
            
        int ans = 0;
        for (int r = 0; r < N; ++r) {
            for (int c = 0; c < N; ++c) {
                int k = 0;
                while (k <= r && r < N - k && k <= c && c < N - k &&
                        !banned.contains((r - k) * N + c) &&
                        !banned.contains((r + k) * N + c) &&
                        !banned.contains(r * N + c - k) &&
                        !banned.contains(r * N + c + k)) {
                    k++;
                }
                ans = Math.max(ans, k);
            }
        }
        return ans;
    }
}

JavaScript soluzione

abbinato/originale
class Solution {
    orderOfLargestPlusSign(N, mines) {
        const banned = new Set();
        for (const mine of mines) {
            banned.add(mine[0] * N + mine[1]);
        }
        
        let ans = 0;
        for (let r = 0; r < N; ++r) {
            for (let c = 0; c < N; ++c) {
                let k = 0;
                while (k <= r && r < N - k && k <= c && c < N - k &&
                      !banned.has((r - k) * N + c) &&
                      !banned.has((r + k) * N + c) &&
                      !banned.has(r * N + c - k) &&
                      !banned.has(r * N + c + k)) {
                    k++;
                }
                ans = Math.max(ans, k);
            }
        }
        return ans;
    }
}

Python soluzione

abbinato/originale
class Solution:
    def orderOfLargestPlusSign(self, N: int, mines: List[List[int]]) -> int:
        banned = set()
        for mine in mines:
            banned.add(mine[0] * N + mine[1])
            
        ans = 0
        for r in range(N):
            for c in range(N):
                k = 0
                while k <= r and r < N - k and k <= c and c < N - k and \
                      (r - k) * N + c not in banned and \
                      (r + k) * N + c not in banned and \
                      r * N + c - k not in banned and \
                      r * N + c + k not in banned:
                    k += 1
                ans = max(ans, k)
        return ans

Go soluzione

abbinato/originale
func orderOfLargestPlusSign(n int, mines [][]int) int {
    grid := make([][]int, n)
    for i := range grid {
        grid[i] = make([]int, n)
        for j := range grid[i] {
            grid[i][j] = n // максимальная возможная длина
        }
    }

    for _, mine := range mines {
        grid[mine[0]][mine[1]] = 0
    }

    for i := 0; i < n; i++ {
        count := 0
        for j := 0; j < n; j++ { // слева направо
            if grid[i][j] == 0 {
                count = 0
            } else {
                count++
                grid[i][j] = min(grid[i][j], count)
            }
        }

        count = 0
        for j := n - 1; j >= 0; j-- { // справа налево
            if grid[i][j] == 0 {
                count = 0
            } else {
                count++
                grid[i][j] = min(grid[i][j], count)
            }
        }
    }

    for j := 0; j < n; j++ {
        count := 0
        for i := 0; i < n; i++ { // сверху вниз
            if grid[i][j] == 0 {
                count = 0
            } else {
                count++
                grid[i][j] = min(grid[i][j], count)
            }
        }

        count = 0
        for i := n - 1; i >= 0; i-- { // снизу вверх
            if grid[i][j] == 0 {
                count = 0
            } else {
                count++
                grid[i][j] = min(grid[i][j], count)
            }
        }
    }

    res := 0
    for i := 0; i < n; i++ {
        for j := 0; j < n; j++ {
            res = max(res, grid[i][j])
        }
    }

    return res
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

Algorithm

Создайте сетку размером n x n, заполненную единицами. Затем используйте array mines, чтобы установить значения нулей в соответствующих ячейках сетки.

Для каждой ячейки в сетке создайте четыре дополнительных сетки: left, right, up и down, которые будут хранить длину непрерывных единиц, простирающихся в соответствующем направлении от каждой ячейки.

Пройдите по всей сетке и для каждой ячейки определите минимальную длину луча среди четырех направлений. Эта минимальная длина будет определять порядок крестообразного знака с центром в данной ячейке. Обновите maximum порядок крестообразного знака и return его после завершения обхода всей сетки. Если такого знака нет, return 0.

😎

Vacancies for this task

offerte attive with overlapping task tags are mostrati.

Tutte le offerte
Non ci sono ancora offerte attive.