M選N的組合算法
只要每個數字出現一次就可以
舉例 :也就是說123與321和213屬於重復 只算一組
此算法已經排除了重復數據
應用--彩票的注數算法
本程序的思路是開一個數組b,其長度和數據數組一致,其前N位為1,N就是要取的數的個數,然后按照b的數據為1的下標來取數據數組的數字
然后從左到右掃描數組b元素值的“10”組合,找到第一個“10”組合后將其變為
“01”組合,同時將其左邊的所有“1”全部移動到數組的最左端,“0”移到所有“1”和變為了“01”的中間
當b數組最右邊的N個元素全部為1時 組合完畢
例如求5中選3的組合:
1 2 3 4 5 <-數組數組
1 1 1 0 0 -->1,2,3
1 1 0 1 0 -->1,2,4
1 0 1 1 0 -->1,3,4
0 1 1 1 0 -->2,3,4
1 1 0 0 1 -->1,2,5
1 0 1 0 1 -->1,3,5
0 1 1 0 1 -->2,3,5
1 0 0 1 1 -->1,4,5
0 1 0 1 1 -->2,4,5
0 0 1 1 1 -->3,4,5
package test;
import java.util.ArrayList;
import java.util.List;
public class MyCombine {
public static void main(String[] args) {
String[] a = { "1", "2", "3", "4", "5","6","7"};
int num = 5;
MyCombine tp = new MyCombine();
for (String obj : tp.combine(a, num)) {
break;
//System.out.println(obj);
}
}
/**
* 實現的算法
* @param a 數據數組
* @param num M選N中 N的個數
* @return
*/
private List<String> combine(String[] a, int num) {
List<String> list = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
String[] b = new String[a.length];
for (int i = 0; i < b.length; i++) {
if (i < num) {
b[i] = "1";
} else
b[i] = "0";
}
int point = 0;
int nextPoint = 0;
int count = 0;
int sum = 0;
String temp = "1";
while (true) {
// 判斷是否全部移位完畢
for (int i = b.length - 1; i >= b.length - num; i--) {
if (b[i].equals("1"))
sum += 1;
}
// 根據移位生成數據
for (int i = 0; i < b.length; i++) {
if (b[i].equals("1")) {
point = i;
sb.append(a[point]);
sb.append(" ");
count++;
if (count == num)
break;
}
}
// 往返回值列表添加數據
list.add(sb.toString());
// 當數組的最后num位全部為1 退出
if (sum == num) {
break;
}
sum = 0;
// 修改從左往右第一個10變成01
for (int i = 0; i < b.length - 1; i++) {
if (b[i].equals("1") && b[i + 1].equals("0")) {
point = i;
nextPoint = i + 1;
b[point] = "0";
b[nextPoint] = "1";
break;
}
}
// 將 i-point個元素的1往前移動 0往后移動
for (int i = 0; i < point - 1; i++)
for (int j = i; j < point - 1; j++) {
if (b[i].equals("0")) {
temp = b[i];
b[i] = b[j + 1];
b[j + 1] = temp;
}
}
// 清空 StringBuffer
sb.setLength(0);
count = 0;
}
//
System.out.println("數據長度 " + list.size());
return list;
}
}
http://dearseven.blog.163.com/blog/static/1005379222010471135567/