Trouver le plus petit nombre dans la matrice rotative triée
Je suis tombé sur cette question dans une Interview. S'il vous plaît aidez-moi à obtenir la solution.
Question est:
Vous avez trié rotatif tableau, j'. e. le tableau contient des éléments qui sont triés et il peut être tourné de manière circulaire, comme si les éléments du tableau sont [5,6,10,19,20,29], puis en faisant tourner première fois tableau devient [29,5,6,10,19,20] et en deuxième temps, il devient [20,29,5,6,10,19] et ainsi de suite.
Si vous avez besoin de trouver le plus petit élément du tableau à tout moment. Vous ne serez pas fourni avec le nombre de fois de la matrice de rotation. Juste compte tenu de la rotation des éléments d'un tableau et de trouver le plus petit d'entre eux. Dans ce cas, la sortie devrait être de 5.
source d'informationauteur Mojoy
Vous devez vous connecter pour publier un commentaire.
Méthode 1:
Vous pouvez le faire dans
O(logN)
temps.Utiliser une version modifiée de recherche binaire pour trouver le point de rotation qui est un indice
i
tels quearr[i] > arr[i+1]
.Exemple:
Les deux sous-tableaux
(arr[1], arr[2], .., arr[i])
et(arr[i+1], arr[i+2], ..., arr[n])
sont triés.La réponse est
min(arr[1], arr[i+1])
Méthode 2:
Lorsque vous divisez le tri, la rotation de tableau en deux moitiés
(arr[1],..,arr[mid])
et(arr[mid+1],..,arr[n])
l'un d'eux est toujours triée et l'autre toujours a la min. Nous pouvons directement utiliser une version modifiée de recherche binaire de continuer à chercher dans les ménagères de la moitiéCi-dessus algorihtm échoue si l'élément de données est répété comme {8,8,8,8,8} ou {1,8,8,8,8} ou {8,1,8,8,8} ou {8,8,1,8,8} ou {8,8,8,8,1}
De Trouver le plus petit nombre dans la triés rotation de tableau:
à l'aide de la recherche Binaire concept
Mais si vous ne voulez pas utiliser les Binaires de Recherche, puis :
Voici le code en Python:
Mon code est ci-dessous avec l'algorithme sous forme de commentaires. Fonctionne même pour les éléments répétés.
Cela peut être fait en O(1) fois dans le meilleur des cas, en O(n) fois pire des cas, et O(lg n) de temps en moyenne.
Pour une rotation du tableau trié, si le premier élément du tableau est moins que le dernier élément dans le tableau, puis le tableau trié est pas tourné (ou rotation vers la position 0). L'élément minimum est tout simplement le premier élément.
Si le milieu de l'élément est moins que le dernier élément, alors le minimum de l'élément est dans le [premier, milieu].
Si le milieu de l'élément est plus grand que le dernier élément, alors le minimum de l'élément est dans [milieu + 1, dernier].
Si le milieu de l'élément est égal au dernier élément, alors il y a deux sous-cas:
J'ai écrit le code suivant en C++ pour résoudre ce problème, qui doit gérer tous les cas (tableau vide, les éléments répétés).
Trouver Min index dans la circulaire tableau trié
Dans le cas où on a besoin d'elle.. Mon implémentation en java..
prend soin de trier/non triés dans l'ordre croissant//ordre décroissant usecases..
inconvénient est qu'il sera toujours effectuer log n étapes pour trouver la valeur min dans un parfait ensemble trié, sans rotation.
http://ideone.com/fork/G3zMIb
Erreurs/suggestions/l'échec de la usecases sont accueillis
L'algorithme suivant prend log(n) fois. En supposant que le tableau n'a pas de doublon.
Je l'ai fait à l'aide d'une version légèrement modifiée de recherche binaire. Ce que je fais ici est je continue à gauche ou à droite selon l'endroit où le minimum pourrait être. Par exemple dans un croissant tableau si le milieu de l'élément est inférieur gauche de la plupart élément, il est possible que le minimum est à gauche. Alors que recursing à travers le tableau, j'ai aussi garder une trace de la minimale. La récursivité se poursuit jusqu'à la fin et puis la dernière minute est retourné. Cela fonctionne également avec les éléments répétés.
Question : Trouver le minimum triés rotation de tableau .
Solution 1 : Utilisation De La Recherche Binaire