Sous l'hypothèse numéros de moins que l'un ne sont pas autorisés et il n'y a pas de doublons, il y a une simple sommation d'identité pour ce - la somme des nombres d' 1
de m
par incréments de 1
est (m * (m + 1)) / 2
. Vous pouvez alors la somme de la matrice et de l'utilisation de cette identité.
Vous pouvez savoir si il existe un dupe en vertu de la ci-dessus garantit, en plus de la garantie qu'aucun nombre n'est au-dessus de m ou moins de n (ce qui peut être vérifié en O(N)
)
L'idée en pseudo-code:
0) Commencer à N = 0
1) Prendre la N-ième élément de la liste.
2) Si elle n'est pas à la bonne place si la liste avait été triés, vérifier où il devrait être.
3) Si le lieu où il doit être a déjà le même numéro, vous avez un double - RETURN TRUE
4) Sinon, échanger les numéros (pour mettre le premier nombre dans le bon endroit).
5) Avec le numéro que vous avez juste échangé avec, est-il au bon endroit?
6) Si non, retournez à l'étape deux.
7) dans le cas Contraire, commencez à l'étape un, avec N = N + 1. Si ce serait après la fin de la liste, vous n'avez pas dupes.
Et, oui, qui s'exécute en O(N)
bien qu'il puisse ressembler O(N ^ 2)
Note pour tout le monde (des trucs collectées à partir des commentaires)
Cette solution fonctionne sous l'hypothèse que vous pouvez modifier le tableau, puis utilise en lieu Radix sort (qui réalise O(N)
de la vitesse).
D'autres mathy-des solutions ont été mises de l'avant, mais je ne suis pas sûr que n'importe quel d'entre eux ont été prouvés. Il y a un tas de sommes qui pourraient être utiles, mais la plupart d'entre eux s'exécuter dans un résumé du nombre de bits nécessaires à la représentation de la somme, qui viole les lois de la constante de l'espace supplémentaire de garantie. Aussi, je ne sais pas si certains d'entre eux sont capables de produire un numéro distinct pour un ensemble donné de nombres. Je pense qu'une somme de carrés peut travail, qui a connu une formule pour le calculer (voir Wolfram s)
Nouvelles idées (bien, plus de de réflexions qui n'aident pas à résoudre le problème, mais sont intéressantes et je vais au lit):
Ainsi, il a été mentionné, peut-être à utiliser sum + somme des carrés. On ne savait pas si cela a fonctionné ou pas, et j'ai réalisé que cela ne devient un problème que lorsque (x + y) = (n + m), comme le fait que 2 + 2 = 1 + 3. Les places ont aussi ce problème grâce à des triplets de Pythagore (donc 3^2 + 4^2 + 25^2 == 5^2 + 7^2 + 24^2, et la somme des carrés ne fonctionne pas). Si nous utilisons le dernier théorème de Fermat, on sait que cela ne peut pas se produire pour n^3. Mais nous ne savons pas non plus si il n'y a pas de x + y + z = n (à moins de faire et je ne sais pas elle). Donc pas de garantir cela, trop, ne pas casser - et si nous continuons dans cette voie, nous rapidement de bits.
Dans ma joie, cependant, j'ai oublié de noter que vous pouvez briser la somme des carrés, mais en faisant ainsi, vous créez une normale somme qui n'est pas valide. Je ne pense pas que vous pouvez faire les deux, mais, comme il a été noté, nous n'avons pas une preuve en soit.
Je dois dire, de trouver des contre-exemples est parfois beaucoup plus facile que de prouver des choses! Considérons les séquences suivantes, qui ont toutes un montant de 28 et une somme de carrés de 140:
[1, 2, 3, 4, 5, 6, 7]
[1, 1, 4, 5, 5, 6, 6]
[2, 2, 3, 3, 4, 7, 7]
Je ne pouvais pas trouver tout de tels exemples de longueur inférieure ou égale à 6. Si vous voulez un exemple que les valeurs min et max aussi, essayez celui-ci de longueur 8:
[1, 3, 3, 4, 4, 5, 8, 8]
Approche la plus simple (la modification de hazzen de l'idée):
Un tableau d'entiers de longueur m contient tous les nombres de n à n+m-1 exactement une fois iff
- chaque élément du tableau est entre n et n+m-1
- il n'y a pas de doublons
(Raison: il y a seulement les valeurs de m dans l'intervalle entier, de sorte que si le tableau contient des m valeurs uniques dans cette gamme, il doit contenir chacun d'entre eux une fois)
Si vous êtes autorisé à modifier le tableau, vous pouvez vérifier à la fois en un seul passage à travers la liste avec une version modifiée de hazzen de l'algorithme idée (il n'est pas besoin de faire une sommation):
- Pour tous les indices de tableau i de 0 à m-1 faire
- Si tableau[i] < n ou tableau[i] >= n+m => RETURN FALSE ("valeur hors de l'intervalle trouvé")
- Calculer j = tableau[i] - n (c'est le 0 de la position de tableau[i] dans une triés tableau avec les valeurs de n à n+m-1)
- Alors que j n'est pas égal à i
- Si la liste[i] est égal à la liste[j] => RETURN FALSE (en double"trouvé")
- Liste d'échange[i] liste[j]
- Recalculer j = tableau[i] - n
- RETURN TRUE
Je ne suis pas sûr si la modification du tableau original de chefs d'accusation contre le maximum autorisé de l'espace supplémentaire de O(1), mais si ce n'est pas ce qui devrait être la solution de l'affiche originale voulait.