classSolution: defpermute(self, nums: List[int]) -> List[List[int]]: # 1. 每个位置都要填一个数 # 2. 每个位置填的数互不相同 n = len(nums) ans = [] path = [0] * n defdfs(i: int, s: Set[int]) -> None: if i == n: ans.append(path.copy()) return for x in s: path[i] = x dfs(i + 1, s - {x}) dfs(0, set(nums)) return ans
classSolution: defsolveNQueens(self, n: int) -> List[List[str]]: ans = [] col = [0] * n
defvalid(r, c): for R inrange(r): C = col[R] if r+c == R+C or r-c == R-C: returnFalse returnTrue
defdfs(r, s): if r == n: ans.append(['.'*c + 'Q' + '.'*(n-1-c) for c in col]) return for c in s: if valid(r, c): col[r] = c dfs(r+1, s-{c}) dfs(0, set(range(n))) return ans
时间复杂度:O(n^2*n!)。 空间复杂度:O(n)。
做法2
优化:既然可以用 r + c 和 r - c 判断,那么干脆把 r + c 记录到一个布尔数组 diag1 中,在放皇后前判断,如果 diag1[r+c] 为真,则无法放皇后。