從10個數字中取5個數的所有組合

2021-04-07 02:35:16 字數 1041 閱讀 8927

哈,申請了這個blog好久也沒有在上面寫東西(太懶),今天回答了乙個問題覺得字挺多的,搬到這裡來。

哈這個問題有點意思,我自認為小學的時候數學還可以哈哈,來討論一下。

可以模擬手算的演算法:

先簡化問題,從2/3問題開始

先排序1.2.3

取出1然後還需要再取乙個數字可以是2.可以是3這樣我們得到[1.2][1.3]所有含有1的二元組已經取到。

然後我們列舉所有含2的二元組,取出2還要再取乙個數字,注意這裡有乙個要點我們只可以向後取不可以向前取,這是為了不產生重複的二元組,理解這個要點對解決這個問題很重要。所以這裡只可以取3得到[2.3]

下面我們取所有含有3的組合,取出3根據向後取的原則,我們發現已經沒有可以取到的數字了。這樣這個問題就結束了我們得到結果[1.2][1.3][2.3]

下面我們把這個問題擴充套件一下變成3/4問題

排序:1.2.3.4

先列舉含有1的三元組,取出1,這裡另外乙個要點來了,我們的任務轉化成為要在2.3.4中取出所有的2元組然後和1組成三元組這樣這裡轉化為2/3問題,之後我們取所有含2的三元組,注意只能向後取的原則,問題轉化為在3.4中取2元組的2/2問題

看到這裡我們應該可以理解手算的操作方法了。

要把這個操作改寫成計算機演算法並不複雜。

result_array fn(source_array,start,end,n)

實現這樣乙個遞迴函式就可以了

result_array 是乙個list內容是所有要求的n元組,source_array是原始的元素集合,start,end表明了區間,n是n元組的n,這樣做是為了節省空間,免得每次遞迴都要複製出乙個array作為取值元素集合。

方法裡面的內容:

哈哈大家補充,不複雜的。

基本上是乙個迴圈

先判斷n是否=1 是就把所有元素放到乙個list中返回,如果不是的話

對每乙個元素如果他右面的元素》=n-1那麼就對右面的元素呼叫fn(source_array,當前位置+1,末尾,n-1)那返回結果和元素組合放進乙個list中,如果小於n-1了那麼跳出迴圈返回這個list。

就這樣了。

10 億個數取中位數

10 億個數取中位數 1 取 16 1024 個數,生成乙個 treemap 取得最大值 max 和最小值 min。2 構造乙個1024個元素的計數陣列 t i 對最初的 1024 個數按區間計數 對 min 和 max 進行 1024 個等分,各等分值為 n i 當資料 n a 3 將大於 n 5...

(演算法)從10000個數中找出最大的10個

從10000個整數中找出最大的10個,最好的演算法是什麼?演算法一 氣泡排序法 千里之行,始於足下。我們先不說最好,甚至不說好。我們只問,如何 從10000個整數中找出最大的10個 我最先想到的是用氣泡排序的辦法 我們從頭到尾走10趟,自然會把最大的10個數找到。方法簡單,就不再這裡寫 了。這個演算...

求 從m個自然數中任取n個數的所有組合

問題 編寫乙個遞迴演算法,找出從自然數1,2,3,m中任取n個數的所有組合。例如 m 5,n 3時,所有組合為543,542,541,532,531,521,432,431,421,321。方法1 設這m個自然數存放在整數陣列a k 中,a i 存放i 1 0 i n 1 可採用遞迴演算法,例如,m...