java排列組合演算法(M選N)
從M長度的容器中每次選取N個元素
舉例,從(a,b,c,d,e)中取兩個元素,則為(ab) (ac) (ad)(ae)(bc)(bd)(be)(cd)(ce)(de)
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
public class Combination {
//elements為要操作的資料集合,即長度為M的容器,num為每次取的元素個數
public static List<List<String>> combiner(List <String> elements, int num,
List<List<String>> result){
//當num為1時,即返回結果集
if(num == 1){
return result;
}
//result的長度是變化的,故把原始值賦給變數leng
int leng = result.size();
//迴圈遍歷,將 elements每兩個元素放到一起,作為result中的一個元素
for (int i = 0; i < leng; i++) {
for (int j = 0; j < elements.size(); j++) {
if(!result.get(i).contains(elements.get(j))){
List<String> list1 = new ArrayList<String>();
for (int j2 = 0; j2 < result.get(i).size(); j2++) {
list1.add(result.get(i).get(j2));
}
list1.add(elements.get(j));
Collections.sort(list1);
result.add(list1);
}
}
}
//將result中的迴圈遍歷前的資料刪除
for (int i = 0; i < leng; i++) {
result.remove(0);
}
//對result進行去重
Iterator<List<String>> it=result.iterator();
List<List<String>> listTemp= new ArrayList<List<String>>();
while(it.hasNext()){
List<String> a=it.next();
if (listTemp.contains(a)){
it.remove();
}else {
listTemp.add(a);
}
}
//遞迴計算,根據num的值來確定遞迴次數
combiner(elements, num - 1, result);
return result;
}
//elements為要操作的資料集合,即長度為M的容器,num為每次取的元素個數
public static List<List<String>> findsort(List<String> elements, int num){
List<List<String>> result = new ArrayList<List<String>>();
//將elements中的資料取出來,存到新的list中,為後續計算做準備
for (int i = 0; i < elements.size(); i++) {
List<String> list = new ArrayList<String>();
list.add(elements.get(i));
result.add(list);
}
return combiner(elements, num, result);
}
//驗證
public static void main(String args[]) {
List<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
//從list中每次取三個元素
List<List<String>> result =findsort(list, 3);
for (int i = 0; i < result.size(); i++) {
for (int j = 0; j < result.get(i).size(); j++) {
System.out.print(result.get(i).get(j) + " ");
}
System.out.println();
}
}
}
控制檯輸出
a b c
a b d
a b e
a c d
a c e
a d e
b c d
b c e
b d e
c d e
相關推薦
java排列組合演算法(M選N)
從M長度的容器中每次選取N個元素 舉例,從(a,b,c,d,e)中取兩個元素,則為(ab) (ac) (ad)(ae)(bc)(bd)(be)(cd)(ce)(de) import java.util.ArrayList; import java.uti
java 高效率的排列組合演算法(java實現)
package BeanUtil; import java.util.ArrayList; import java.util.List; import com.work.core.exception.OurException; /** * 統計任三出現的最
中過象棋棋盤一半 馬踏日 從(1,1)出發只能向右踏出,到(m,n)有多少路徑
# include<stdio.h> # include<math.h> # define M 9 # define N 5 int a[10]={1},b[10]={1},sum=0,m,p;//a[]儲存橫座標,b[]儲存縱座標 int check(int n){ i
Java詞頻統計演算法(使用單詞樹)
許多英語培訓機構(如新東方)都會出幾本“高頻詞彙”的書,主要內容是統計近幾年來各類外語考試中屢次出現的高頻詞彙,幫助考生減少需要背的生詞的數量。但這些高頻是如何被統計出來的呢?顯然不會用手工去計算。假如我們已經將一篇文章存在一字串(String)物件中,為了統計詞彙出現頻率
m選n組合的兩種演算法(C語言實現)
原問題: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. 1. 遞迴演算法 即首先選擇n,然後遞迴地從剩下的1...n-1選擇k-1
js實現不同陣列m選n個數的組合演算法
原理比較簡單,m陣列中的每個數要麼出現,要麼不出現,只要滿足n個數出現就可以了 演算法步驟: 1、先生成一個和m陣列一樣長度的臨時陣列flagArr(陣列中除了0,就是1),flagArr中值為1的表示m該在位置的數字出現,0則表示不出現。初始化flagArr,前n位為1
c# C(m,n) 排列組合演算法
n從1到m的所有組合: static void Main() { string[] arr = new string[] { "a", "b", "c", "d", "e" }; L
//組合演算法 從M個數中取出N個數,無順序
[self myCombineAlgorithm:MutableArray num:5]; //組合演算法 從M個數中取出N個數,無順序 -(void)myCombineAlgorithm:(NSMutableArray*)src num:(int)getnu
排列組合演算法 java
排列組合問題,最簡潔有效的方法則是利用遞迴 一、無重複資料選K個組合: /* * 無重複資料組合--dfs解法 * data為資料 re為結果, curpo為當前位置,curlen為當前結果的長度 ,K為目標長度 *例如 data=“123456” 選3個字元組合,
字串的全排列和組合演算法(遞迴非遞迴)
全排列在筆試面試中很熱門,因為它難度適中,既可以考察遞迴實現,又能進一步考察非遞迴的實現,便於區分出考生的水平。所以在百度和迅雷的校園招聘以及程式設計師和軟體設計師的考試中都考到了,因此本文對全排列作下總結幫助大家更好的學習和理解。對本文有任何補充之處,歡迎大家指出。
C/C++ 編程計算2的100萬次方(m的n次方),超長結果輸出文件
class bre tdi content snippet 輸入 urn i++ 清空緩存 #include <iostream> #include <stdio.h> #include <stdlib.h> #include &
【BZOJ1008】越獄(排列組合計數,容斥原理)
code typedef ostream ima bzoj1008 image sca fin space 題意: 思路: 1 #include<cstdio> 2 #include<cstdlib> 3 #include<ios
Java-經典排序演算法(二)——快速排序
快速排序 快速排序之所以比較快,是因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定一個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大得多了。因此總的比較和交
Java-經典排序演算法(一)
前言: 排序演算法有很多種,如選擇排序、插入排序、氣泡排序、桶排序、快速排序等等。這裡介紹的是簡化版桶排序、氣泡排序和插入排序。 推薦一本演算法入門書——《啊哈!演算法》 1. 桶排序[簡化版]: 原理:新建一個book陣列用來標記原陣列每一個數字出現的個數。
dfs 全排列演算法(含重複元素)
1、數的全排列 求數字 1 ~ n 的全排列,例如 1~3 的全排列,輸出 1 2 3, 1 3 2 , 2 1 3, 2 3 1, 3 1 2, 3 2 1 #include<bits/stdc++.h> using namespace std; #define runfil
如何用兩個棧模擬實現一個佇列? 如果這兩個堆疊的容量分別是m和n(m>n),你的方法能保證佇列的最大容量是多少?
保證入隊完畢之後才可以出隊; 分析:棧的特點是“後進先出(LIFO)”,而佇列的特點是“先進先出(FIFO)”。用兩個棧模擬實現一個佇列的基本思路是:用一個棧作為儲存空間,另一個棧作為輸出緩衝區,入隊時把元素按順序壓入兩棧模擬的佇列,出隊時按入隊的順序出棧即可。 如下圖,用容
(Java資料結構和演算法)最小生成樹---Kruskal演算法(並查集)
該文章利用prime演算法求得連通圖的最小生成樹對應的邊權最小和,prime演算法是從頂點的角度思考和解決問題。本文介紹的Kruskal演算法將從邊的角度考慮並解決問題,利用了並查集方便地解決了最小生成樹的問題。 本文參考博文 //並查集 class UnionSameSet{
全排列演算法(使用遞迴)
問題描述 對於任意的n個字母,實現其的全排列,並查詢第m個,其排列形式。我寫的這個程式碼中主要用的遞迴。 程式碼如下 #include<stdio.h>int n,book[10],k; &nbs
java排列組合遞迴實現
import java.util.Scanner; public class combination { public static int k1=0; //計數k1 public static int k2=0;
劍指offer_1:給你一根長度為n的繩子,把繩子剪成m段(m、n都是整數且m > 1, n > 1),m段繩子的長度依然是整數,求m段繩子的長度乘積最大為多少? * 比如繩子長度為8,我們可以分成
<code> package Chap2; /**問題描述 * 給你一根長度為n的繩子,把繩子剪成m段(m、n都是整數且m > 1, n > 1),m段繩子的長度依然是整數,求m段繩子的長度乘積最大為多少? * 比如繩子長度為8,我們可以分成2