LeetCode 46. Permutations
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]
]
思路一:通过遍历线性表每次选择一个元素将其加入链表,删除该元素并递归执行,当线性表中没有元素是结束递归。
public class Node{
intval;
Nodenext;
publicNode(int val){
this.val= val;
}
}
public voiddfs(List<List<Integer>> res, Node head, List<Integer> ans){
if(head.next==null) {res.add(newArrayList<Integer>(ans)); return;}
Node p = head, q=head.next;
while(q!=null){
ans.add(q.val);
p.next = q.next;
dfs(res,head,ans);
ans.remove(ans.size()-1);
p.next = q;
p = p.next; q= q.next;
}
}
完整代码:
class Solution {
publicclass Node{
intval;
Nodenext;
publicNode(int val){
this.val= val;
}
}
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> res = newArrayList<List<Integer>>();
if(nums.length == 0) return res;
Arrays.sort(nums);
Node head= new Node(0);
Node p=head;
for(int i=0;i<nums.length;i++){
Node tmp=newNode(nums[i]);
p.next = tmp;
p = p.next;
}
dfs(res,head,new ArrayList<Integer>());
return res;
}
public voiddfs(List<List<Integer>> res, Node head, List<Integer> ans){
if(head.next==null) {res.add(newArrayList<Integer>(ans)); return;}
Node p = head, q=head.next;
while(q!=null){
ans.add(q.val);
p.next = q.next;
dfs(res,head,ans);
ans.remove(ans.size()-1);
p.next = q;
p = p.next; q= q.next;
}
}
}
思路二:通过每次交换当前元素i 与 i+k元素递归调用:
private void backtrack(int[]nums,List<List<Integer>> result,List<Integer> res,int index)
{
if(index==nums.length)
{
result.add(newArrayList<Integer>(res));
return;
}
for(int i=index;i<nums.length;i++)
{
swap(nums,index,i);
res.add(nums[index]);
backtrack(nums,result,res,index+1);
res.remove(res.size()-1);
swap(nums,index,i);
}
}
完整代码:
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
List<Integer> res = new ArrayList<>();
if(nums!=null && nums.length>0)
backtrack(nums,result,res,0);
return result;
}
private void backtrack(int[] nums,List<List<Integer>>result,List<Integer> res,int index)
{
if(index==nums.length)
{
result.add(new ArrayList<Integer>(res));
return;
}
for(int i=index;i<nums.length;i++)
{
swap(nums,index,i);
res.add(nums[index]);
backtrack(nums,result,res,index+1);
res.remove(res.size()-1);
swap(nums,index,i);
}
}
private void swap(int[] nums,int i,int j)
{
int tmp = nums[i];
nums[i]=nums[j];
nums[j]=tmp;
}
}