Maison > développement back-end > Tutoriel Python > Maximiser l'intervalle

Maximiser l'intervalle

Mary-Kate Olsen
Libérer: 2024-12-28 08:32:10
original
685 Les gens l'ont consulté

Maximizing the interval

Défi hebdomadaire 298

Chaque semaine, Mohammad S. Anwar envoie The Weekly Challenge, une chance pour nous tous de trouver des solutions à deux tâches hebdomadaires. C'est une excellente façon pour nous tous de pratiquer le codage.

Défi, Mes solutions

Tâche 1 : Carré maximal

Tâche

Vous recevez une matrice binaire m x n avec 0 et 1 seulement.

Écrivez un script pour trouver le plus grand carré contenant uniquement des 1 et renvoyer son aire.

Ma solution

Ma fonction principale commence par vérifier que la matrice a le bon nombre de colonnes pour chaque ligne

def maximal_square(matrix: list[list[int]]) -> int:
    rows = len(matrix)
    cols = len(matrix[0])
    maximum_size = 0

    for row in range(rows):
        if len(matrix[row]) != cols:
            raise ValueError("Row %s has the wrong number of columns", row)
Copier après la connexion
Copier après la connexion

Il parcourt ensuite chaque cellule de la matrice. Si l'élément dans cette cellule est un 1, il vérifie alors la taille du carré à partir de cette position. La variable max_side est également calculée pour garantir que nous ne sortons pas des limites. Nous gardons une trace de la valeur maximum_size et renvoyons la plus grande.

    for row in range(rows):
        for col in range(cols):
            if matrix[row][col] == 1:
                max_side = min(rows-row, cols-col)
                size = find_square_from_point(matrix, row, col, max_side)
                if size > maximum_size:
                    maximum_size = size

    return maximum_size
Copier après la connexion
Copier après la connexion

La fonction find_square_from_point était frustrante à réussir. En fait, j'ai fait quelques essais avant d'avoir une solution que j'étais heureux de m'engager. La logique est assez simple. Considérez le carré :

. b c d
b b c d
c c c d
d d d d
Copier après la connexion

À mesure que la taille du carré augmente, il me suffit de vérifier le bas et le côté droit de chaque carré, car je sais que la partie intérieure du carré a déjà été vérifiée. Donc pour la première itération (une surface de quatre), je vérifie les cellules b. A l'itération suivante (zone de 9), je vérifie les cellules c, et ainsi de suite.

Voici le code de la fonction :

def find_square_from_point(matrix, x: int, y: int, max_side: int) -> int:
    side = 1
    for s in range(1, max_side):
        all_ones = True
        for i in range(s+1):
            if matrix[x+i][y+s] == 0 or matrix[x+s][y+i] == 0:
                all_ones = False
                break

        if not all_ones:
            break

        side += 1

    return side ** 2
Copier après la connexion

Exemples

$ ./ch-1.py "[[1, 0, 1, 0, 0],[1, 0, 1, 1, 1],[1, 1, 1, 1, 1],[1, 0, 0, 1, 0]]"
4

$ ./ch-1.py "[[0, 1],[1, 0]]"
1

$ ./ch-1.py "[[0]]"
0
Copier après la connexion

Tâche 2 : intervalle correct

Tâche

Vous recevez un tableau de @intervals, où $intervals[i] = [starti, endi] et chaque starti est unique.

Le bon intervalle pour un intervalle i est un intervalle j tel que startj >= endi et startj est minimisé. Veuillez noter que je peux égaler j.

Écrivez un script pour renvoyer un tableau d'indices d'intervalle droits pour chaque intervalle i. Si aucun intervalle droit n'existe pour l'intervalle i, alors mettez -1 à l'index i.

Ma solution

Pour cette tâche, j'ai une solution qui fonctionne, mais je ne suis pas convaincu qu'elle soit la plus efficace. Pour chaque intervalle, j'ai défini trois variables :

  1. La valeur end_i stocke la valeur de fin (deuxième) que nous devons prendre en compte
  2. La valeur lower_j stocke la valeur de départ la plus basse trouvée jusqu'à présent (ou Aucune si elle n'est pas trouvée).
  3. La variable index_j stocke l'index de la valeur_j la plus basse, ou -1 si elle n'est pas trouvée.

J'ai alors une boucle interne qui itère sur les intervalles. Si la valeur start_j (première valeur de l'intervalle) est supérieure ou égale à end_i et est inférieure à lower_j, je mets à jour les valeurs lower_j et index_j.

def maximal_square(matrix: list[list[int]]) -> int:
    rows = len(matrix)
    cols = len(matrix[0])
    maximum_size = 0

    for row in range(rows):
        if len(matrix[row]) != cols:
            raise ValueError("Row %s has the wrong number of columns", row)
Copier après la connexion
Copier après la connexion

Pour les entrées de la ligne de commande, je prends une liste d'entiers et je les associe automatiquement.

Exemples

    for row in range(rows):
        for col in range(cols):
            if matrix[row][col] == 1:
                max_side = min(rows-row, cols-col)
                size = find_square_from_point(matrix, row, col, max_side)
                if size > maximum_size:
                    maximum_size = size

    return maximum_size
Copier après la connexion
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal