前面写过3个排列。这里再写一次。
1.全部都不重复https://oj.leetcode.com/problems/permutations/
(使用交换法)只是本人对c++ stl不熟,不会把排列结果保存,这里用java写一遍。
public class Solution {
public List<List<Integer>> permute(int[] num) { ArrayList<ArrayList<Integer>> total=new ArrayList<ArrayList<Integer>>(); if(num.length==0) return (List)total;
int lev=0;
per(total,num,lev);
return (List)total; }
public void swap(int num[],int i,int j)
{
int temp=num[i];
num[i]=num[j];
num[j]=temp; } public void per(ArrayList<ArrayList<Integer>> total,int num[],int lev)
{
if(lev==num.length)
{
ArrayList ar=new ArrayList<Integer>();
for(int i=0;i<num.length;i++)
{
ar.add(num[i]);
}
total.add(ar); }
else
{
for(int i=lev;i<num.length;i++)
{
swap(num,lev,i); per(total,num,lev+1);
swap(num,lev,i); } } }
}
2.
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]
.
思路就是 假设当前考虑的是第一位的2 ,只有第一个1需要交换,因为 1 21 和1 12 对于,21和12排列都向等,所以,在前文的基础上加上一个过滤的交换条件就行