LeetCode Permutations
2015-09-27 11:51
337 查看
原题链接在这里:https://leetcode.com/problems/permutations/
题目:
Given a collection of distinct numbers, return all possible permutations.
For example,
题解:
与Combinations相似,都是NP问题可以采用递归加回朔,递归的终止条件与Combinations相同,item.size()满足要求就把item加到res里。
这里采用boolean [] used数组来代表当前数是否被用过。若是被用过就跳过,没有被用过把nums[i]加到item中,然后递归剩下的元素。
当递归结束后,减掉item尾部元素,同时需要维护used数组,把当前位置变回false, 确保进入递归和结束递归时状态相同。
Time Complexity: exponential.
AC Java:
这道题的迭代方法如下:
与Subsets相似,开始时item先加nums[0],然后把item加到res里,然后每次添加新的nums[i],首先把res里的每一个item拿出来,用cur表示。
在cur的所有可能位置加上新的元素nums[i], 然后把它加载回res里。
Note: res原有的item不能保留,所以每次扫描res所有item前新建newRes, 添加完新元素nums[i]的item是要加到newRes中去的,所有可能的item都加完后再把newRes赋值回res去。
Time Complexity: exponential.
AC Java:
跟上Permutations II
题目:
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], and
[3,2,1].
题解:
与Combinations相似,都是NP问题可以采用递归加回朔,递归的终止条件与Combinations相同,item.size()满足要求就把item加到res里。
这里采用boolean [] used数组来代表当前数是否被用过。若是被用过就跳过,没有被用过把nums[i]加到item中,然后递归剩下的元素。
当递归结束后,减掉item尾部元素,同时需要维护used数组,把当前位置变回false, 确保进入递归和结束递归时状态相同。
Time Complexity: exponential.
AC Java:
public class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(nums == null || nums.length == 0){ return res; } boolean [] used = new boolean[nums.length]; helper(nums,used,new ArrayList<Integer>(), res); return res; } private void helper(int[] nums, boolean [] used, List<Integer> item, List<List<Integer>> res){ if(item.size() == nums.length){ res.add(new ArrayList<Integer>(item)); return; } for(int i = 0; i<nums.length; i++){ if(!used[i]){ used[i] = true; item.add(nums[i]); helper(nums,used,item,res); item.remove(item.size()-1); used[i] = false; } } } }
这道题的迭代方法如下:
与Subsets相似,开始时item先加nums[0],然后把item加到res里,然后每次添加新的nums[i],首先把res里的每一个item拿出来,用cur表示。
在cur的所有可能位置加上新的元素nums[i], 然后把它加载回res里。
Note: res原有的item不能保留,所以每次扫描res所有item前新建newRes, 添加完新元素nums[i]的item是要加到newRes中去的,所有可能的item都加完后再把newRes赋值回res去。
Time Complexity: exponential.
AC Java:
public class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> res = new ArrayList<List<Integer>>(); if(nums == null || nums.length == 0){ return res; } List<Integer> item = new ArrayList<Integer>(); item.add(nums[0]); res.add(item); for(int i = 1; i<nums.length; i++){ List<List<Integer>> newRes = new ArrayList<List<Integer>>(); for(int j = 0; j<res.size(); j++){ List<Integer> cur = res.get(j); for(int k = 0; k<=cur.size(); k++){ // 记得这里要做个copy, 不能直接在原来的cur上加 item = new ArrayList<Integer>(cur); item.add(k, nums[i]); newRes.add(item); } } res = newRes; } return res; } }
跟上Permutations II
相关文章推荐
- 第三周vim入门学习1
- LAMP编译安装
- Auto Layout 界面自动布局系列 (使用代码添加布局约束)
- Ret2Libc 练习(2) -- VirtualProtect
- 关于JDBC连接Class.forName()的思考
- 多线程-经典买票问题
- Auto Layout界面自动布局系列 (使用VFL添加布局约束)
- Linux常用命令之文件处理命令
- 机器学习读书笔记(开篇)
- android改变字体的颜色的三种方法
- ASP.NET无刷新分页简单实现
- SetConsoleTextAttribute()用法
- redis key,string,hash,list,set,zset指令汇总
- Auto Layout界面自动布局 (Interface Builder布局)
- 【转】lucene4.3.0 配置与调试
- 第一章 软件工程概述
- HDU 5478 Can you find it (数学_随机化,取特殊值!!!)
- 自定义XML
- HDU 5479 Scaena Felix
- JAVA中modle,dao,service,action的功能区分