题目

解题
排列问题 基本就是回溯法
from typing import *
def solution(nums: List[int]):
    """
    回溯法
    路径 
    """
    rst = []
    length = len(nums)
    visited = [False for i in range(length)]
    def backtrack(path, chooice_list):
        """
        位置为 i 时候的排列情况
        """
        if len(path) >= len(chooice_list):
            rst.append(path[:])
            return
        for i in range(len(chooice_list)):
            if not visited[i]:
                visited[i] = True
                path.append(nums[i])
                backtrack(path,chooice_list)
                path.pop()
                visited[i] = False
    backtrack([],nums)
    return rst
执行的顺序逻辑如下:
permute([1, 2, 3])
|
|--backtrack([])
|  |
|  |--choose 1
|  |  |
|  |  |--backtrack([1])
|  |  |  |
|  |  |  |--choose 2
|  |  |  |  |
|  |  |  |  |--backtrack([1, 2])
|  |  |  |  |  |
|  |  |  |  |  |--choose 3
|  |  |  |  |  |  |
|  |  |  |  |  |  |--backtrack([1, 2, 3]) - Add [1, 2, 3] to result
|  |  |  |  |  |  |
|  |  |  |  |  |  |--backtrack([1, 2]) - Pop 3, mark 3 as unvisited
|  |  |  |  |  |
|  |  |  |  |  |--choose 3 (already visited, skip)
|  |  |  |  |
|  |  |  |  |--backtrack([1]) - Pop 2, mark 2 as unvisited
|  |  |  |
|  |  |  |--choose 3
|  |  |  |  |
|  |  |  |  |--backtrack([1, 3])
|  |  |  |  |  |
|  |  |  |  |  |--choose 2
|  |  |  |  |  |  |
|  |  |  |  |  |  |--backtrack([1, 3, 2]) - Add [1, 3, 2] to result
|  |  |  |  |  |  |
|  |  |  |  |  |  |--backtrack([1, 3]) - Pop 2, mark 2 as unvisited
|  |  |  |  |  |
|  |  |  |  |  |--choose 2 (already visited, skip)
|  |  |  |  |
|  |  |  |  |--backtrack([1]) - Pop 3, mark 3 as unvisited
|  |  |
|  |  |--choose 2
|  |  |  |
|  |  |  |--backtrack([2])
|  |  |  |  |
|  |  |  |  |--choose 1
|  |  |  |  |  |
|  |  |  |  |  |--backtrack([2, 1])
|  |  |  |  |  |  |
|  |  |  |  |  |  |--choose 3
|  |  |  |  |