返回介绍

lcof2 / 剑指 Offer II 083. 没有重复元素集合的全排列 / README

发布于 2024-06-17 01:04:41 字数 5239 浏览 0 评论 0 收藏 0

剑指 Offer II 083. 没有重复元素集合的全排列

题目描述

给定一个不含重复数字的整数数组 nums ,返回其 所有可能的全排列 。可以 按任意顺序 返回答案。

 

示例 1:

输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

 

提示:

  • 1 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

 

注意:本题与主站 46 题相同:https://leetcode.cn/problems/permutations/ 

解法

方法一

class Solution:
  def permute(self, nums: List[int]) -> List[List[int]]:
    n = len(nums)
    res = []
    path = [0] * n
    used = [False] * n

    def dfs(u):
      if u == n:
        res.append(path.copy())
        return
      for i in range(n):
        if not used[i]:
          path[u] = nums[i]
          used[i] = True
          dfs(u + 1)
          used[i] = False

    dfs(0)
    return res
class Solution {
  public List<List<Integer>> permute(int[] nums) {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    int n = nums.length;
    boolean[] used = new boolean[n];
    dfs(0, n, nums, used, path, res);
    return res;
  }

  private void dfs(
    int u, int n, int[] nums, boolean[] used, List<Integer> path, List<List<Integer>> res) {
    if (u == n) {
      res.add(new ArrayList<>(path));
      return;
    }
    for (int i = 0; i < n; ++i) {
      if (!used[i]) {
        path.add(nums[i]);
        used[i] = true;
        dfs(u + 1, n, nums, used, path, res);
        used[i] = false;
        path.remove(path.size() - 1);
      }
    }
  }
}
class Solution {
public:
  vector<vector<int>> permute(vector<int>& nums) {
    int n = nums.size();
    vector<vector<int>> res;
    vector<int> path(n, 0);
    vector<bool> used(n, false);
    dfs(0, n, nums, used, path, res);
    return res;
  }

  void dfs(int u, int n, vector<int>& nums, vector<bool>& used, vector<int>& path, vector<vector<int>>& res) {
    if (u == n) {
      res.emplace_back(path);
      return;
    }
    for (int i = 0; i < n; ++i) {
      if (!used[i]) {
        path[u] = nums[i];
        used[i] = true;
        dfs(u + 1, n, nums, used, path, res);
        used[i] = false;
      }
    }
  }
};
func permute(nums []int) [][]int {
  n := len(nums)
  res := make([][]int, 0)
  path := make([]int, n)
  used := make([]bool, n)
  dfs(0, n, nums, used, path, &res)
  return res
}

func dfs(u, n int, nums []int, used []bool, path []int, res *[][]int) {
  if u == n {
    t := make([]int, n)
    copy(t, path)
    *res = append(*res, t)
    return
  }
  for i := 0; i < n; i++ {
    if !used[i] {
      path[u] = nums[i]
      used[i] = true
      dfs(u+1, n, nums, used, path, res)
      used[i] = false
    }
  }
}
/**
 * @param {number[]} nums
 * @return {number[][]}
 */
var permute = function (nums) {
  const n = nums.length;
  let res = [];
  let path = [];
  let used = new Array(n).fill(false);
  dfs(0, n, nums, used, path, res);
  return res;
};

function dfs(u, n, nums, used, path, res) {
  if (u == n) {
    res.push(path.slice());
    return;
  }
  for (let i = 0; i < n; ++i) {
    if (!used[i]) {
      path.push(nums[i]);
      used[i] = true;
      dfs(u + 1, n, nums, used, path, res);
      used[i] = false;
      path.pop();
    }
  }
}
using System.Collections.Generic;
using System.Linq;

public class Solution {
  public IList<IList<int>> Permute(int[] nums) {
    var results = new List<IList<int>>();
    var temp = new List<int>();
    var visited = new bool[nums.Length];
    Search(nums, visited, temp, results);
    return results;
  }

  private void Search(int[] nums, bool[] visited, IList<int> temp, IList<IList<int>> results)
  {
    int count = 0;
    for (var i = 0; i < nums.Length; ++i)
    {
      if (visited[i]) continue;
      ++count;
      temp.Add(nums[i]);
      visited[i] = true;
      Search(nums, visited, temp, results);
      temp.RemoveAt(temp.Count - 1);
      visited[i] = false;
    }
    if (count == 0 && temp.Any())
    {
      results.Add(new List<int>(temp));
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文