Cet article étudie principalement le contenu lié à la plus grande sous-matrice des réseaux de programmation Java, comme détaillé ci-dessous.
Rencontrer une bonne personne peut changer votre vie; Rencontrer un bon livre, n'est-ce pas?
Récemment, j'ai eu beaucoup d'idées lorsque j'ai lu " The Optimal Solutions pour l'algorithme et les questions de structure de données du Guide d'entrevue du Code du programmeur " . Il est recommandé que les blogueurs qui ont des passe-temps dans ce domaine vont également regarder.
L'algorithme de la plus grande matrice du tableau basé sur la pile expliquée dans le livre est très classique, mais le blogueur a une capacité limitée et n'a pas été en mesure de bien comprendre l'essence de l'algorithme. Cependant, sur la base de cette idée, le blogueur a proposé un algorithme simple pour faire face à ce type de problème, qui est résumé comme suit.
Idée de base
Jetons un coup d'œil à une photo en premier, et nous pouvons le comprendre grossièrement.
Comme le montre la figure, chaque tour est une opération, et notre noyau est l'opération interne pour chaque tour.
Calculez la longueur maximale de chaque couche en continu et ininterrompu
En d'autres termes, nous sommes le tableau le plus important pour calculer les rondes inférieures au bas, puis nous pouvons calculer la zone de la sous-matrice maximale continue qui peut être obtenue dans ce tour pour chaque tour. Ensuite, il vous suffit de comparer les données les plus importantes pour chaque tour et de revenir pour trouver la zone du plus grand sous-matrice continue du tableau.
Code
D'accord, avec les idées de base ci-dessus présentées, nous pouvons commencer à écrire du code. (Bien que je ne pense pas que je l'ai dit très clairement, pardonnez-moi).
package stack_and_queue; / ** * @author guo pu <br> * Calculez la zone de la plus grande zone de rectangle continu basé sur le tableau * / classe publique maxrectangle {public static void main (String [] args) {Integer [] arr = {2, 1, 3, 5, 7, 4}; Integer MaxRectangle = Maxrectangleleaa (arr); System.out.println ("La zone de la plus grande zone rectangulaire continue du tableau est:" + MaxRectangle);} / ** * @param arr * @return la zone maximale de la zone de rectangle continu dans la table int [arr.length]; // calculez le tableau en traversant la longueur continue du bas à vers le haut pour (int i = 1; i <= arr.length; i ++) {// La valeur temporaire de la longueur continue accumulée dans le rond actuel est implémentée int temple = 0; // enregistrer la longueur continue maximale à la hauteur de cette première ligne, et à démarrer le templen_max = 0; // la laine de la ligne de la première bouteille, et à démarrer la couche, et à démarrer la couche, et à démarrer la couche de la première couche, et à démarrer la couche de la première couche, et à démarrer la couche de la première couche, et à démarrer le premier Lumer à partir de l'indice de première couche entraînera la perte de la partie précédente des données pour (int j = 1; j <= arr.length; j ++) {if (arr [j - 1]> = i) {templen + = 1; templen_max = templen;} else {templen = 0;}} résultat [i - 1] = i * templen_max; //Système. i + "La longueur maximale continue et ininterrompue de la couche est:" + templen_max);} // trouvez le nombre avec la plus grande valeur numérique dans le tableau de jeu de résultats, c'est-à-dire la zone du plus grand domaine rectangulaire dans la zone de continuité trouvée int maxarea = 0; pour (int i = 0; i <Result. Maxarea: Résultat [i];} // Renvoie la zone du champ de rectangle continu maximal obtenu en renvoyant Maxarea;}}Les commentaires du code sont également relativement complets, donc je n'entrerai pas dans trop de détails.
test
Ce qui suit est un test du tableau. Tout d'abord, testons-le avec le tableau illustré sur l'image au début de cet article.
Entier [] arr = {2,1,3,5,7,6,4} ・・・・La zone de la plus grande zone rectangulaire continue du tableau est: 16
Ensuite, nous modifions les valeurs des éléments dans le tableau pour tester davantage pour voir si les résultats sont corrects.
Entier [] arr = {2,1,3,1,7,6,4} ・・・・La zone de la plus grande zone rectangulaire continue du tableau est: 12
Après que le blogueur l'a lui-même testé, l'algorithme fonctionne normalement. :)
Partie d'optimisation
En parlant de la partie d'optimisation, la première chose que nous pouvons voir est de trouver la valeur maximale dans le tableau de jeu de résultats dans la dernière étape.
En effet, nous pouvons réellement appliquer une autre variable pour enregistrer la zone du plus grand sous-matrice de la ronde jusqu'à présent. Cependant, cette optimisation ne joue pas un grand rôle, et il n'y a pas d'amélioration significative dans la complexité temporelle.
Un autre point, je pense que le meilleur point d'entrée est d'ajouter un jugement lors de la réalisation de calculs pour chaque cycle pour décider de faire un tour vers le bas avant le tour actuel. Si les éléments du tableau fluctuent considérablement, le niveau d'optimisation est toujours très bon.
Résumer
Ce petit algorithme est plus exquis, et la seule chose qui est plus imparfaite est que la complexité du temps est légèrement plus intense. Si les lecteurs recherchent un algorithme avec une complexité de temps relativement faible, veuillez prendre un détour.
C'est assez bon si vous voulez juste trouver un résultat. Au moins, il est beaucoup plus efficace que la méthode violente de calcul.
Ce qui précède est tout le contenu de cet article sur la solution simple à la sous-matrice maximale dans les tableaux de programmation Java. J'espère que ce sera utile à tout le monde. Les amis intéressés peuvent continuer à se référer à d'autres sujets connexes sur ce site. S'il y a des lacunes, veuillez laisser un message pour le signaler. Merci vos amis pour votre soutien pour ce site!