Leetcode: Permutations II 理解分析
2014-04-22 09:01
375 查看
题目大意: 给定一个整型数组,数组中可能存在重复的数字,求出该数组中数字的全排列。
理解: 1)本题中的数组中可能存在重复的数字,对于全排列来说两个相等的数交换位置后的排列与交换前是相同的一个。如[1, 1, 2] 的全排列包括:[1, 1, 2], [1, 2, 1, [2, 1, 1]。与Permutations(http://blog.csdn.net/blog_szhao/article/details/24286397)相对应。
2)用递归实现,首先需要将给定的数组排序,然后统计每个数字出现的次数,key[]存放不同的数字,val[]存放每个数字出现的次数。同样要注意递归状态的恢复。
实现:
理解: 1)本题中的数组中可能存在重复的数字,对于全排列来说两个相等的数交换位置后的排列与交换前是相同的一个。如[1, 1, 2] 的全排列包括:[1, 1, 2], [1, 2, 1, [2, 1, 1]。与Permutations(http://blog.csdn.net/blog_szhao/article/details/24286397)相对应。
2)用递归实现,首先需要将给定的数组排序,然后统计每个数字出现的次数,key[]存放不同的数字,val[]存放每个数字出现的次数。同样要注意递归状态的恢复。
实现:
public class Solution { private ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>(); private int len = 0, lens = 0; private ArrayList<Integer> arr = new ArrayList<Integer>(); private int[] key, val; public void init(int[] s) { key = new int[len]; val = new int[len]; key[0] = s[0]; val[0] = 1; int t = 0; lens = 1; for(int i = 1; i < len; i ++) { if(s[i] == s[i-1]) { val[t] ++; } else { lens ++; key[++ t] = s[i]; val[t] = 1; } } // 注:此处是错误的,这样获得的长度是new时的长度,并不是实际key有效元素的长度 // lens = key.length; } public void func(int pos) { if(pos == len) { ArrayList<Integer> tmp = new ArrayList<Integer>(); for(int i = 0; i < arr.size(); i ++) { tmp.add(arr.get(i)); } res.add(tmp); return; } for(int i = 0; i < lens; i ++) { // 遍历不相同的元素 if(val[i] > 0) { // 相同元素的每个元素遍历一遍 arr.add(key[i]); val[i] --; func(pos + 1); arr.remove(arr.size() - 1); // 恢复状态 val[i] ++; } } } public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) { if(num == null || num.length == 0) return res; Arrays.sort(num); len = num.length; init(num); func(0); return res; } }
相关文章推荐
- Leetcode: Same Tree 理解分析
- 【算法分析】如何理解快慢指针?判断linked list中是否有环、找到环的起始节点位置。以Leetcode 141. Linked List Cycle, 142. Linked List Cycle II 为例Python实现
- Leetcode Linked List Cycle II 理解分析
- Leetcode: Maximum Depth of Binary Tree 理解分析
- Leetcode: Binary Tree Level Order Traversal 理解分析
- Leetcode: Max Points on a Line 分析理解
- Leetcode: LRU Cache 理解分析
- Leetcode: Two Sum 理解分析
- Leetcode: Longest Consecutive Sequence 理解分析
- Leetcode: Binary Tree Level Order Traversal II 理解分析
- Leetcode: Copy List With Random Pointer分析理解
- Leetcode: Path Sum 理解分析
- Leetcode: Path Sum II 理解分析
- LeetCode Generate Parentheses 深度分析理解
- Leetcode: Remove Duplicates from Sorted Array II 理解分析
- Leetcode: Search in Rotate Sorted Array II 理解分析
- Leetcode: Subsets II 理解分析
- Leetcode: Symmetric Tree 理解分析
- Leetcode: Minimum Depth of Binary Tree 理解分析
- Leetcode: Binary Tree Zigzag Level Order Traversal 理解分析