【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]
]
排列组合问题。
思路:递归。通过将第一个数与后面的数依次交换,使每个数充当一次开头。然后进行下一轮从第二个数开始的递归……..
还是因为
第二种思路还是递归,上面递归用的是交换,这边用的是添加。
重点是每次循环最后记得remove最后一个元素。
思路三是利用动态规划。
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(46)Permutations
- leetcode46/47-Permutations I/II(全排列问题)
- LeetCode 46 Permutations + LeetCode 47 Permutations II
- leetcode || 46、Permutations
- Leetcode 46 Permutations
- LeetCode-46-Permutations 暴力递归
- leetcode-46 Permutations
- leetcode-46、47 Permutations/II 数字的排列组合
- LeetCode(46)Permutations
- [Leetcode]#46 Permutations
- Leetcode 46 Permutations
- leetcode 46: permutations
- LeetCode 46 - Permutations
- LeetCode46 Permutations
- 【LEETCODE】46-Permutations
- LeetCode 数字排列问题 46 Permutations
- LeetCode 46 Permutations
- LeetCode46,47 Permutations, Permutations II
- leetcode 46 : Permutations
- Leetcode46 Permutations