您的位置:首页 > 其它

leedcode做题总结, 题目Permutations I/II46/47

2015-01-08 09:59 375 查看
这两道题是生成一串数字的所有可能排列,方法都是回溯法。第二题需要判断重复,这里使用一个Set来储存已经生成的字符串来进行判断重复。

public class Solution {
private void generate( LinkedList<Integer> l, LinkedList<Integer> numl, LinkedList<List<Integer>> res){
if(numl.size()==0){
res.add(new LinkedList<Integer>(l));
}else{
for(int i=0;i<numl.size();i++){
int tmp = numl.remove(i);
l.add(tmp);
generate(l,numl,res);
l.remove(l.size()-1);
numl.add(i,tmp);

}
}

}

public List<List<Integer>> permute(int[] num) {
LinkedList<List<Integer>> res = new LinkedList<List<Integer>>();
if( num.length==0)
return res;
LinkedList<Integer> numl = new LinkedList<Integer> ();
for(int i=0;i<num.length;i++){
numl.add(num[i]);
}
//HashSet<String> s = new HashSet<String>();
LinkedList<Integer> l = new LinkedList<Integer>();
generate(l,numl,res);
return res;
}
}


public class Solution {
private void generate(String current, LinkedList<Integer> l, HashSet<String> s, LinkedList<Integer> numl, LinkedList<List<Integer>> res){
if(numl.size()==0){
if(!s.contains(current)){
s.add(current);
res.add(new LinkedList<Integer>(l));
}
}else{
for(int i=0;i<numl.size();i++){
if(i==0||i!=0&&numl.get(i)!=numl.get(i-1)){
int tmp = numl.remove(i);
String tmpstring = current;
tmpstring=tmpstring+tmp;
l.add(tmp);
generate(tmpstring,l,s,numl,res);
l.remove(l.size()-1);
numl.add(i,tmp);
}
}
}

}
public List<List<Integer>> permuteUnique(int[] num) {
LinkedList<List<Integer>> res = new LinkedList<List<Integer>>();
if( num.length==0)
return res;
Arrays.sort(num);
LinkedList<Integer> numl = new LinkedList<Integer> ();
for(int i=0;i<num.length;i++){
numl.add(num[i]);
}
HashSet<String> s = new HashSet<String>();
LinkedList<Integer> l = new LinkedList<Integer>();
String current = "";
generate(current,l,s,numl,res);
return res;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: