Recherche de plages contiguës dans des tableaux
Vous êtes donné un tableau d'entiers. Vous avez à la sortie de la gamme la plus large de sorte que tous les numéros de la plage sont présents dans le tableau. Les chiffres sont susceptibles d'être présents dans n'importe quel ordre. Par exemple, supposons que le tableau est
{2, 10, 3, 12, 5, 4, 11, 8, 7, 6, 15}
Ici, nous trouvons deux (non trivial) les plages de tous les entiers de ces gammes sont présentées dans le tableau, à savoir [2,8] et [10,12]. En dehors de ces [2,8] est le plus long. Nous avons donc besoin de la puissance.
Quand on m'a donné à cette question, j'ai été invité à le faire dans le temps linéaire et sans aucun tri. J'ai pensé qu'il pourrait être une base de hachage solution, mais je ne pouvais pas trouver quoi que ce soit.
Voici ma tentative de solution:
void printRange(int arr[])
{
int n=sizeof(arr)/sizeof(int);
int size=2;
int tempans[2];
int answer[2];//the range is stored in another array
for(int i =0;i<n;i++)
{
if(arr[0]<arr[1])
{
answer[0]=arr[0];
answer[1]=arr[1];
}
if(arr[1]<arr[0])
{
answer[0]=arr[1];
answer[1]=arr[0];
}
if(arr[i] < answer[1])
size += 1;
else if(arr[i]>answer[1]) {
initialize tempans to new range;
size2=2;
}
else {
initialize tempans to new range
}
}
//I have to check when the count becomes equal to the diff of the range
Je suis bloqué à cette partie... je ne peux pas comprendre comment de nombreux tempanswer[] tableaux doivent être utilisés.
source d'informationauteur garima
Vous devez vous connecter pour publier un commentaire.
Je pense que la suite de la solution en O(n) en temps à l'aide de O(n) de l'espace.
Commencer par mettre tous les éléments dans le tableau dans une table de hachage. Ensuite, créez une deuxième table de hachage qui stocke les éléments que nous avons "visité", qui est initialement vide.
Maintenant, itérer à travers le tableau d'éléments un à un. Pour chaque élément, vérifier si l'élément est dans le visité ensemble. Si oui, l'ignorer. Sinon, compter à partir de cet élément vers le haut. À chaque étape, vérifiez si le numéro est dans la principale de la table de hachage. Si oui, continuer en avant et de marquer la valeur actuelle dans le cadre de l'visité ensemble. Si non, stop. Ensuite, répétez cette procédure, à l'exception de comptage à la baisse. Ceci nous indique le nombre d'éléments contigus dans la plage contenant ce tableau de la valeur. Si nous gardons la trace de la plus grande plage d'trouvé cette façon, nous aurons une solution à notre problème.
L'exécution de la complexité de cet algorithme est O(n). Pour voir cela, notons que l'on peut construire la table de hachage dans la première étape en O(n) fois. Ensuite, lorsque nous avons commencer la numérisation de tableau de trouver le plus grand de la gamme, chaque scanné prend du temps proportionnel à la longueur de cet intervalle. Puisque la somme des longueurs des plages est le nombre d'éléments dans le tableau d'origine, et depuis nous n'avons jamais scan de la même gamme deux fois (parce que nous marquer chaque nombre que l'on visite), cette deuxième étape prend O(n) fois, pour une nette d'exécution de O(n).
EDIT: Si vous êtes curieux, j'ai un L'implémentation Java de cet algorithme, avec une analyse approfondie de pourquoi il fonctionne et pourquoi il a de la bonne exécution. Il explore également les quelques cas qui n'apparaissent pas dans la description initiale de l'algorithme (par exemple, comment traiter de dépassement d'entier).
Espérons que cette aide!
La solution pourrait utiliser
BitSet
:De L'Échantillon I/O:
La réponse ci-dessus par le modèle va fonctionner, mais vous n'avez pas besoin d'une table de hachage. Le hachage pourrait prendre un certain temps en fonction de ce que l'algorithme que vous utilisez. Vous pouvez demander à l'intervieweur s'il y a un max de nombre entier peut être, puis créer un tableau de cette taille. Appel il existe[] Ensuite analyser arr et marque[i] = 1; Puis itérer sur[] garder la trace des 4 variables, la taille de l'actuel plus grand de la gamme, et le début de la plus grande plage, taille de la gamme actuelle, et le début de la plage actuelle. Quand vous voyez existent[i] = 0, de comparer l'état actuel de la gamme des valeurs de vs un plus grand éventail de valeurs et de mise à jour de la plus grande plage de valeurs si nécessaire.
Si il n'y a aucune valeur max, alors vous pourriez avoir à aller avec la méthode de hachage.
Fait en considérant que nous ne sommes qu'à trier des entiers et, par conséquent, une comparaison de tri n'est PAS nécessaire, vous pouvez trier le tableau à l'aide d'un Radix - ou BucketSort et puis itérer sur elle.
Simple, et certainement pas ce que la personne voulait entendre, mais correct néanmoins 😉
Un Haskell mise en œuvre de Grigor Guevorguyan de la solution, à partir d'un autre qui n'a pas la chance de les poster avant le question a été marqué comme un doublon...(met simplement à jour le hachage et la plus longue plage de mesure, tout en parcourant la liste)
De sortie:
Voici la solution en Java:
D'autres approches ici.
J'ai lu beaucoup de solutions sur de multiples plateformes à ce problème et on retenu mon attention, car elle résout le problème, très élégant, et il est facile à suivre.
L'épine dorsale de cette méthode est de créer un ensemble/hachage qui prend O(n) le temps et à partir de là, tous les accès à l'ensemble/hash sera O(1). Comme le O-Notation omettre de termes constants, cet Algorithme peut encore être décrit comme
O(n)
Il est simple si vous avez exécuté plus simple avec des chiffres. Le
Optimization
étape, c'est un court-circuit à assurez-vous de commencer à compter, lorsque le nombre précis de labeginning
d'une séquence.Tous les Crédits à Stefan Pochmann.
Un moyen rapide de le faire (PHP) :