每日一省之 遞迴法計算陣列的所有排列組合

2021-07-16 15:39:23 字數 963 閱讀 4935

本演算法的目的: 給定一組數字,求這些數字的所有可能的排序組合。

演算法內部邏輯:模擬人進行排列組合的過程。

1. 假設僅有2個數字, 則交換其位置,可以得到所有可能的組合,也即2組。

2. 假設有3個數字。則取出第1個數字,將第2和第3個數字交換位置後得到2種組合,然後在每種組合的開頭插入第1個數字。得到了3個數字排列組合的其中兩種;

然後取出第2個數字,將第1和第3個數字交換位置後得到2種組合,然後在每種組合的開頭插入第2個數字。又得到了3個數字排列組合的其中兩種

接著取出第3個數字,將第1和第2個數字交換位置後得到2種組合,然後在每種組合的開頭插入第3個數字。又得到了3個數字排列組合的其中兩種。至此,我們得到了3個數字的所有排列組合(6種)

3. 假設有4個數字。與3個數字一樣,依次取出其中的某乙個,將剩餘的3個進行排列得到6種組合,然後在這6種組合的開頭插入一開始取出的那個元素。這樣,遍歷這4個數字一遍之後,可以得到一共4*6=24種組合。

4. 假設有5個數字,同理:依據步驟2或3或4的邏輯,把大的陣列化小,得到較小的陣列返回的可能的排列組合後,再拼接成較大的陣列的排列組合。

上述的分析過程表明可以使用遞迴的方法進行實現。具體實現**如下:

public

class

combine

system.out.println();

}system.out.println("一共有 " + count + " 種組合");

}public

static list> combination(listlist)

list> result = new arraylist>();

int size = list.size();

if (size == 2) else

if (size > 2) }}

return result;

}}

2022統一省選總結

集訓時狀態調整了好久才找到感覺,當時只剩兩個星期了,還經常掛分。開始的好長一段時間是沒有好好靜下來全情投入的,主要是掛著 qq 的話容易手癢點一下,這樣思路就很容易斷,特別是像我這種實力遠遠沒有達到頂尖的選手。如此長一段時間的收穫還是挺大的。知識點方面 惡補了之前跳過的一些演算法,如 lct 最小直...

統一省選2022 自閉記

複習了一點資料結構 字串板子,考前有億點點緊張,過了很久才睡著。到了 cdqz,遇到了一堆巨佬,感覺有點自閉。讀了 3 遍 t1 題面,感覺有點暈,大概想了想怎麼寫。t2,發現暴力都難打,冷靜思考發現列舉最小值容斥一下就行,好像要拉差求字首和,但我上次寫拉差已經是一年以前的事了,有億點點慌。t3 完...

省市區sql語句之 (一)省

drop table if exists provinces create table provinces id int 11 not null auto increment,provinceid varchar 20 not null,province varchar 50 not null,pr...