回溯法——permutation、permutation II数组数字的全排列

题目描述:permutation


Given a collection of 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].


import java.util.*;
public class Solution {
     public ArrayList<ArrayList<Integer>> permute(int[] num) {
	        ArrayList<ArrayList<Integer>> array=new ArrayList();
	        if(num == null||num.length == 0)
	            return array;
	        
	         perm(num,0,array);
	        return array;
	    }
	    public void perm(int[] num,int index,ArrayList<ArrayList<Integer>> array)
	        {
	        if(index == num.length-1)
	            {
                ArrayList<Integer> list=new ArrayList();
	            for(int i=0;i<num.length;i++)
	                {
	                list.add(num[i]);
	            }
	            array.add(list);
	            return;
	        }
	        for(int i=index;i<num.length;i++)
	            {
	            swap(num,index,i);
	            perm(num,index+1,array);
	            swap(num,index,i);
	        }
	    }
	    public void swap(int[] num,int i,int j)
	        {
	        int temp=num[i];
	        num[i]=num[j];
	        num[j]=temp;
	    }
}


题目描述:permutation II

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].


题意:数组有重复数字的情况,集合ArrayList中不允许出现重复排列。

import java.util.*;
public class Solution {
    public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {
         ArrayList<ArrayList<Integer>> array=new ArrayList();
        if(num == null||num.length == 0)
            return array;
        
        perm(num,0,array);
        return array;
    } 
    public void perm(int[] num,int index,ArrayList<ArrayList<Integer>> array)
        {
        if(index == num.length-1)
            {
            ArrayList<Integer> list=new ArrayList();
            for(int i=0;i<num.length;i++)
                {
                list.add(num[i]);
            }
            array.add(list);
            return;
        }
        for(int i=index;i<num.length;i++)
            {
            if(is_swap(num,i,index) == true)//前便没有出现过该数则可以交换
                {
                swap(num,index,i);
                perm(num,index+1,array);
                swap(num,index,i);
            }
        }
    }
    public boolean is_swap(int[] num,int i,int index)
        {
        for(int k=index;k<i;k++)
            {
            if(num[k] == num[i])
                return false;
        }
                return true;
    }
    public void swap(int[] num,int i,int j)
        {
        int temp=num[i];
        num[i]=num[j];
        num[j]=temp;
    }
}


Given a collection of 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].

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值