Permutations II
2015-10-02 18:34
323 查看
题目:
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
and
分析:
貌似做过,不造怎么又跳出来了,但是跳出来的时候有代码,然后我就修改了下,然后竟然成功了yeah!!
原代码:
修改过后的代码:
这里用 if(i >= 1 && !visited[i - 1] && nums[i] == nums[i - 1])代替if(i > index && nums[i] == nums[i - 1])
之前有每次i从index下标开始遍历,可以保证前面重复的元素已经用过一次了,而这里每次从下标0开始,如果不用!visited[i - 1],就会导致重复的元素第一次被调用的时候,就跳过去了,即如果是【1,1】的话,访问第2个1的时候,第1个1已经访问过了,visited[i - 1] = true,直接continue了,会返回空。
Given a collection of numbers that might contain duplicates, return all possible unique permutations.
For example,
[1,1,2]have the following unique permutations:
[1,1,2],
[1,2,1],
and
[2,1,1].
分析:
貌似做过,不造怎么又跳出来了,但是跳出来的时候有代码,然后我就修改了下,然后竟然成功了yeah!!
原代码:
public static List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> list = new ArrayList<List<Integer>>(); boolean[] visited = new boolean[nums.length]; List<Integer> inner = new ArrayList<Integer>(); permuteUnique(nums, 0, inner, visited, list); return list; } public static void permuteUnique(int[] nums, int index, List<Integer> inner, boolean[] visited, List<List<Integer>> list) { if(inner.size() == nums.length){ if(!list.contains(inner)){ list.add(new ArrayList<Integer>(inner)); } return; } for(int i = index; i < nums.length; i++){ if(i != index && find(nums, index, i, nums[i])) if(visited[i])continue; visited[i] = true; inner.add(nums[i]); permuteUnique(nums, index + 1, inner, visited, list); visited[i] = false; inner.remove(inner.size() - 1); } } private static boolean find(int[] nums, int s, int e, int target) { // TODO Auto-generated method stub for (int i = s; i < e; i++) { if (nums[i] == target) { return true; } } return false; }
修改过后的代码:
public class Solution { public static List<List<Integer>> permuteUnique(int[] nums) { List<List<Integer>> list = new ArrayList<List<Integer>>(); Arrays.sort(nums); boolean[] visited = new boolean[nums.length]; List<Integer> inner = new ArrayList<Integer>(); permuteUnique(nums, inner, visited, list); return list; } public static void permuteUnique(int[] nums, List<Integer> inner, boolean[] visited, List<List<Integer>> list) { if(inner.size() == nums.length){ if(!list.contains(inner)){ list.add(new ArrayList<Integer>(inner)); } return; } for(int i = 0; i < nums.length; i++){ if(i >= 1 && !visited[i - 1] && nums[i] == nums[i - 1]) continue; if (visited[i])continue; visited[i] = true; inner.add(nums[i]); permuteUnique(nums, inner, visited, list); visited[i] = false; inner.remove(inner.size() - 1); } } }
这里用 if(i >= 1 && !visited[i - 1] && nums[i] == nums[i - 1])代替if(i > index && nums[i] == nums[i - 1])
之前有每次i从index下标开始遍历,可以保证前面重复的元素已经用过一次了,而这里每次从下标0开始,如果不用!visited[i - 1],就会导致重复的元素第一次被调用的时候,就跳过去了,即如果是【1,1】的话,访问第2个1的时候,第1个1已经访问过了,visited[i - 1] = true,直接continue了,会返回空。
相关文章推荐
- 通过JDBC进行简单的增删改查(以MySQL为例)
- nyoj 12 喷水装置
- 策略模式总结
- kali下搭建WiFi钓鱼热点
- mtu
- HDU 4771 Stealing Harry Potter's Precious
- POJ1679
- C++学习笔记之运算符重载例子
- 难度0 大写和小写交换
- openvswitch 修改dpid(datapath id)
- 《zw版·delphi与Halcon系列原创教程》THOperatorSetX版hello,zw
- c++primer学习:顺序容器(1)
- ryu学习笔记(3) 之 ofctl——同步获取openflow消息
- java Unicode与中文互换
- Float类
- 正则表达式
- springMVC学习指南<附录>tomcat的使用
- linux文件处理命令——文件处理命令
- [iOS开发项目-6] 应用程序管理
- 回答“为什么跳槽”