### https stackoverflow.com/questions/76577865/
### understanding-the-for-loop-in-python-permutation-
### algorithm-back-tracking
class Solution:
def permute(self, nums: list[int]) -> list[list[int]]:
res = []
def backtrack(path, visited):
if len(path) == len(nums):
res.append(path)
return
for i in range(len(nums)):
if not visited[i]:
visited[i] = True
backtrack(path + [nums[i]], visited)
visited[i] = False
backtrack([], [False] * len(nums))
return res
print(Solution().permute(nums=[1, 2, 3]))
## [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1],
## [3, 1, 2], [3, 2, 1]]
CiMjIyBodHRwcyBzdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzY1Nzc4NjUvCiMjIyB1bmRlcnN0YW5kaW5nLXRoZS1mb3ItbG9vcC1pbi1weXRob24tcGVybXV0YXRpb24tCiMjIyBhbGdvcml0aG0tYmFjay10cmFja2luZwoKY2xhc3MgU29sdXRpb246CiAgICBkZWYgcGVybXV0ZShzZWxmLCBudW1zOiBsaXN0W2ludF0pIC0+IGxpc3RbbGlzdFtpbnRdXToKICAgICAgICByZXMgPSBbXQoKICAgICAgICBkZWYgYmFja3RyYWNrKHBhdGgsIHZpc2l0ZWQpOgogICAgICAgICAgICBpZiBsZW4ocGF0aCkgPT0gbGVuKG51bXMpOgogICAgICAgICAgICAgICAgcmVzLmFwcGVuZChwYXRoKQogICAgICAgICAgICAgICAgcmV0dXJuCgogICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obnVtcykpOgogICAgICAgICAgICAgICAgaWYgbm90IHZpc2l0ZWRbaV06CiAgICAgICAgICAgICAgICAgICAgdmlzaXRlZFtpXSA9IFRydWUKICAgICAgICAgICAgICAgICAgICBiYWNrdHJhY2socGF0aCArIFtudW1zW2ldXSwgdmlzaXRlZCkKICAgICAgICAgICAgICAgICAgICB2aXNpdGVkW2ldID0gRmFsc2UKCiAgICAgICAgYmFja3RyYWNrKFtdLCBbRmFsc2VdICogbGVuKG51bXMpKQogICAgICAgIHJldHVybiByZXMKCnByaW50KFNvbHV0aW9uKCkucGVybXV0ZShudW1zPVsxLCAyLCAzXSkpCgojIyBbWzEsIDIsIDNdLCBbMSwgMywgMl0sIFsyLCAxLCAzXSwgWzIsIDMsIDFdLAojIyAgWzMsIDEsIDJdLCBbMywgMiwgMV1dCgo=
[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]