leetcode-數組的全排列的所有結果 思路與代碼

問題描述

問題鏈接:https://leetcode.com/problems/permutations/
給定一個不包含重複元素的整數集合,返回全排列的所有結果

leetcode,medium
46:Permutations

Given a collection of distinct integers, return all possible permutations.

問題分析

既然是全排列,首先想到暴力求解法,但是明顯不合適,那呆寫很多層for循環,無法想象。

對於這種問題,最簡便的方法就是遞歸求解法,因爲數組(輸入的集合可以以數組形式輸入)中的每個元素可以同等對待,而且每個元素都可能處於最終排列的任意位置。因此,瓷器的解法也是遞歸解法。這裏提供兩種解法:

解法1思路:從原數組中拿出來一個元素(pop掉),append進全排列數組中,直到原數組的所有元素都被拿出來,則此時全排列數組成爲所有輸出結果數組中一個。

解法2思路:將原數組的第一個元素拿出來(pop掉),加入到全排列數組中,但是跟思路1不同的是,思路1直接加入到全排列數組的最後,而這裏是分別加入到全排列數組的每一個可能的位置,例如全排列數組當前的元素數量是5個,那麼有6個位置可以加入新的元素,例如下圖中,在1之前、1跟3之間、3跟6之間、6跟2之間、2跟7之間、7之後都可以加入新的元素,因此就有6種結果。

1
3
6
2
7

問題解法

解法1代碼如下:

def permutations(nums):
    def fun(nums_fun, path, res):
        if not nums_fun:
            return res.append(path)
        for i in range(0, len(nums_fun)):
            fun(nums_fun[:i] + nums_fun[i+1:], path + [nums_fun[i]], res)
    res = []
    n = len(nums)
    fun(nums, [], res)
    return res

解法2代碼如下:

def permutations(nums):
    def fun1(nums_fun1, insert_res):
        if len(nums_fun1) == 0:
            res.append(insert_res)
        else:
            for j in range(0, len(insert_res) + 1):
                fun1(nums_fun1[1:] if len(nums_fun1) > 1 else [], insert_res[:j] + [nums_fun1[0]] + insert_res[j:])
    res = []
    n = len(nums)
    fun1(nums, [])
    return res

測試代碼如下:

if __name__ == "__main__":
    nums = [1, 2, 3]
    print(permutations(nums))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章