Permutation: Gibt die k-te Permutation zurück


Prakash N.

Ich weiß, dass es hier zum Beispiel eine O(n)zeitliche Komplexitätslösung für dieses Problem gibt .

Ich bin nur neugierig, warum mein naiver Ansatz O(2^n)in Python nicht funktioniert.

Algorithmus:

Ich finde die Permutationen nur rekursiv und wenn das kth-Element hinzugefügt wird, gebe ich es zurück. Ich erhalte jedoch das Rückgabeergebnis als None. Ich bin nicht sicher, warum Nonemeine Funktion zurückgegeben wird.

class Solution(object):

    # Time complexity O(2 ^ n)
    def getPermutation(self, n, k):
        char_list = map(str, range(1, n + 1)) #convert to strin
        used = [False] * len(char_list)
        result = []
        kthArray = self._getPermutation_helper(result, char_list, used, [], k)
        print kthArray #kthArray is always None

    def _getPermutation_helper(self, result, char_list, used, cur,  k):
        if len(char_list) == len(cur):
            result.append(cur + [])
            print len(result)
            print cur
        if len(result) == k:
            print "cur in kth is {0}".format(cur)
            return cur #cur is printed correctly but not returned
        for i in range(len(char_list)):
            if not used[i]:
                cur.append(char_list[i])
                used[i] = True
                self._getPermutation_helper(result, char_list, used, cur, k)
                # back track
                used[i] = False
                cur.remove(char_list[i])
def main():
    pgm = Solution()
    pgm.getPermutation(3, 6)
    
if __name__ == "__main__":
    main()

Warum wird nicht der richtige Wert zurückgegeben?

IVlad

Weil Sie curzu einem vorherigen Aufruf derselben Funktion zurückkehren, von dem aus Sie ihn nicht weiter bis zum ersten Aufruf zurückgeben.

Sie müssen die gefundene Lösung bis zum ersten Aufruf weitergeben. Beispielsweise:

    for i in range(len(char_list)):
        if not used[i]:
            cur.append(char_list[i])
            used[i] = True

            # Here we do a recursive call, which might find the answer we're looking for.
            # So we save its return value and, if it's not None, we return it.
            r = self._getPermutation_helper(result, char_list, used, cur, k)
            if r is not None:
                return r

Verwandte Artikel


itertools Permutation: Gibt nur bestimmte Kombinationen zurück

Daniel Ich möchte eine Funktion schreiben, die eine Liste (in diesem Fall die Namen der Ports) erstellt und alle möglichen Reihenfolgen dieser Ports ausgibt. Die Reihenfolge, in der die Permutationen gedruckt werden, spielt keine Rolle, aber sie sollten alle m

Beschleunigen Sie die Permutation

mohamadmahdi Ich habe die nächste Aufgabe. Gegebene ganze Zahlen n( 1 <= n <= 1000000) und k( 1 <= k <= n). Es ist erforderlich, eine Permutation pvon ganzen Zahlen zu finden, 1, 2, 3, ..., nso dass die absolute Differenz zwischen jeweils zwei aufeinanderfolge

Python, Permutation zur Permuationsindexfunktion

Fadedbee Ich habe einige Permutationen einer Liste: >>> import itertools >>> perms = list(itertools.permutations([0,1,2,3])) >>> perms [(0, 1, 2, 3), (0, 1, 3, 2), (0, 2, 1, 3), (0, 2, 3, 1), (0, 3, 1, 2), (0, 3, 2, 1), (1, 0, 2, 3), (1, 0, 3, 2), (1, 2, 0, 3)

Finden Sie die Permutation in Javascript

Harry: Bei einem Array arraus Größe nund Index 0<=i<n!möchte ich die i-te Permutation zurückgeben. Ich konnte eine Methode schreiben, die alle Permutationen erhält: function permute (arr) { var permutations = []; if (arr.length === 1) { return [ arr ];

Python für die Permutation

Thomas.Q Ich möchte eine Funktion definieren, die die Permutation für die Eingabe durchführen kann. Die Eingabe ist eine Gruppe von Listen wie: [[(u'sss',)], [(u'ssss',), (u'sssssss',)], [(u'121',), (u'222',)]] . Ich möchte dies als Eingabe haben. Für die Pe

Geben Sie bei n und k die k-te Permutationssequenz zurück

Entdecker: Die Menge [1,2,3,…, n] enthält insgesamt n! einzigartige Permutationen. Durch Auflisten und Beschriften aller Permutationen in der richtigen Reihenfolge erhalten wir die folgende Sequenz (dh für n = 3): "123" 132 "213" "231" 312 "321" Geben Sie bei