您的位置:首页 > 编程语言 > C#

【LeetCode】C# 46、Permutations

2017-10-12 11:35 639 查看
Given a collection of distinct numbers, return all possible permutations.

For example,

[1,2,3] have the following permutations:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

排列组合问题。

思路:递归。通过将第一个数与后面的数依次交换,使每个数充当一次开头。然后进行下一轮从第二个数开始的递归……..



还是因为
IList<IList<int>>
不会初始化而改用
List<List<int>>
导致无法AC的问题。。但结果是正确的。

public class Solution {
public IList<List<int>> Permute(int[] nums)
{
IList<List<int>> ret = new List<List<int>>();
PermutationHelper(ret, nums, 0);
//IList<IList<int>> res = new ArrayList(ret);
return ret;
}

public static void PermutationHelper(IList<List<int>> ret, int[] nums, int index)
{
if (index == nums.Count() - 1)
ret.Add(new List<int>(nums));
else
{
for (int i = index; i < nums.Count(); i++)
{
PermutationSwap(nums, index, i);
PermutationHelper(ret, nums, index + 1);
PermutationSwap(nums, index, i); //remember this!!!
}
}
}

public static void PermutationSwap(int[] nums, int i, int j)
{
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}


第二种思路还是递归,上面递归用的是交换,这边用的是添加。

重点是每次循环最后记得remove最后一个元素。



public class Solution {
public List<List<int>> permute(int[] nums) {
List<List<int>> res = new List<int>();
dfs(res, new List<int>(), nums, new bool[nums.Length]);
return res;
}
private void dfs(List<List<int>> res, List<int> temp, int[] nums, bool[] used) {
if(temp.Count() == nums.Length) {
res.add(new List<int>(temp));
return;
}
for(int i = 0; i < nums.Length; i++) {
if(!used[i]) {
used[i] = true;
temp.Add(nums[i]);
dfs(res, temp, nums, used);
temp.RemoveAt(temp.Count() - 1);
used[i] = false;
}
}
}
}


思路三是利用动态规划。



public class Solution {
public List<List<int>> permute(int[] nums) {
List<List<int>> res = new List<List<int>>();
if (nums.Length == 0 || nums == null)
return res;
List<int> list = new List<int>();
list.Add(nums[0]);
res.Add(list);
for (int i = 1; i < nums.Length; i++) {
for (int j = 0; j < res.Count(); j++) {
for (int k = 0; k <= res[0].Count(); k++) {
List<int> temp = new List<int>(res[0]);
temp.Add(k, nums[i]);
res.Add(temp);
}
res.RemoveAt(0);
}
}
return res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode c#