重複元素排列組合問題java簡單方法
阿新 • • 發佈:2019-01-25
**
例:現有黑、白、紅三種顏色的小球各三個,需要將其排成一條直線,要求任意連續排列的三個小球不可以是同一種顏色,試求排列的方案共有多少種?
此類涉及重複元素的有一個簡便方法。
- 所有元素全排列。,程式碼如下
public static List<List<Integer>> permutation(List<Integer> a) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
int size = a.size();
List<Integer> temp = null;
if(size == 2) {
temp = new ArrayList<Integer>(2);
temp.add(a.get(0));
temp.add(a.get(1));
res.add(temp);
temp = new ArrayList<Integer>(2);
temp. add(a.get(1));
temp.add(a.get(0));
res.add(temp);
} else if(size > 2) {
List<List<Integer>> tempRes = null;
Integer firstNum = null;
List<Integer> tempPar = null;
for(int i=0; i<size; i++ ) {
firstNum = a.get(i);
tempPar = new ArrayList<Integer>(a);
tempPar.remove(i);
tempRes = cal(tempPar);
if(tempRes != null && tempRes.size() > 0) {
for (List<Integer> intList : tempRes) {
intList.add(0, firstNum);
res.add(intList);
}
}
}
}
return res;
}
2.重複元素去重
方法一
public static List<List<Integer>> removeDuplicate(List<List<Integer>> list) { for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } } return list; }
**
方法二
List<List<Integer>> resList = permutation (a);
List<List<Integer>> newres = new ArrayList<List<Integer>>();
for(List<Integer> l : resList){
if(!newres.contains(l)){
newres.add(l);
}
}
方法三
用set去重。
3.找出符合條件的
1.list轉換成陣列
for (List<Integer> intList : newlist) {
Object[] arr =new String[9];//list轉換為陣列
arr = (Object[])intList.toArray();
2.控制條件
public static boolean check(Object[] arr){
if((arr[0].equals(arr[1])&&arr[0].equals(arr[2]))||(arr[1].equals(arr[2])&&arr[1].equals(arr[3]))||(arr[2].equals(arr[3])&&arr[2].equals(arr[4]))||(arr[3].equals(arr[4])&&arr[3].equals(arr[5]))||(arr[4].equals(arr[5])&&arr[4].equals(arr[6]))||(arr[5].equals(arr[6])&&arr[5].equals(arr[7]))||(arr[6].equals(arr[7])&&arr[6].equals(arr[8]))){
return false;
}
else return true;
}