给定一个不含重复数字的数组 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 中的所有整数 互不相同来源:力扣(LeetCode)
链接:力扣
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
C# LeetCode46 全排列问题,题解代码如下:
public class Solution
{
public IList<IList<int>> Permute(int[] nums)
{
return HleetCode.N46Permutations.Commit(nums);
}
//题解类
public partial class HleetCode
{
//46全排列题解
public static class N46Permutations
{
private static List<IList<int>> _res=null;
public static IList<IList<int>> Commit(int[] nums)
{
//异常提前返回
if(nums==null) return null;
if(nums.Length<1) return null;
//创建结果对象
_res=new List<IList<int>>();
//执行算法
Dfs(nums,new bool[nums.Length],new Stack<int>());
//返回结果
return _res;
}
//回溯算法实现
private static void Dfs(int[] srcNums,bool[] isUsed,Stack<int> path)
{
//递归终结条件
if(path.Count==srcNums.Length)
{
_res.Add(new List<int>(path));
return;
}
//递归与回溯
for (int i=0;i<srcNums.Length;i++)
{
if(isUsed[i]) continue;
path.Push(srcNums[i]);
isUsed[i]=true;
Dfs(srcNums,isUsed,path);
isUsed[i]=false;
path.Pop();
}
}
}
}
}
算法性能: