每天一道演算法題 n個球中取出m個球不同思路分析

2021-10-19 05:09:06 字數 1553 閱讀 4089

在開始演算法分析之前,這裡需要引入數學中組合排列的概念,先基本介紹一下組合、排列:

定義:從n個不同的元素中任取m個(m<=n)元素,按照一定的順序排成一列,叫做從n個不同的元素中取出m個元素的排列

使用排列的三個條件:1、n個不同元素;2、任取m個;3、講究順序排列數計算公式:a(n,m)

這裡稍微說明一下,因為第一項有n-(1-1),第二項是n-(2-1),所以說m項就n-(m-1);

舉例:a(4,2)

a(4,1) = > (4*3*2*1)/1

=>4!/ (4-1)!

=>(4*3*2*1)/(3*2*1)

=>4

a(4,0) => 4!/(4-0)!

=>1

定義:從n個不同的元素中任取m個(m<=n)元素並為一組,叫做從n個不同的元素中任取m個元素的組合

使用組合的三個條件:1、n個不同的元素;2、任取m個;3、並為一組,不講究順序組合數計算公式:c(n,m);

4.來個例題:

共同點:都是從n個元素中任取m個元素

不同點:排列與元素的順序有關,而組合與元素的順序無關,也就是說,組合是選擇的結果,而排列是先選擇再排列的結果,舉個例子:abcd四個數按任意2個進行排列,那麼可排列的結果有:ab、ac、ad、bc、bd、cd、ba、ca、da、cb、dc、db,而組合的結果有:ab、ac、ad、bc、bd、cd、對於組合來說,是講究順序的,所以ab和ba對於組合來說屬於同一組合

public

static

intgetball2

(int n,

int m)

return stratum_n/stratum_m;

}

結合這兩種情況的取法,就是題目要求的從n個球中取m個球的所有取法,下面我們開始寫**

//遞迴方式:思路:

// 構造遞迴,假設在要取的m個球中一定要取n個球中的某乙個球,於是

//n個球取m個球就變成了:

// 1.n-1個球中取m-1個球 (一定要取某乙個球,那麼剩下的就從n-1個球中取m-1個球)

// 2.n-1個球中取m個球(一定不取某個球,那麼剩下的就從n-1個球中取m個)

public

static

intgetball

(int n,

int m)

每天一道演算法題

no.1 棧是特殊的線性表,它。a.對 b.錯答案 錯,它的插入和刪除都是在同一端進行的。no.2 n個葉子節點的滿二叉樹 除了葉子節點,每個節點都有兩個孩子 總共有多少個節點?a.2n 1 b.2n c.n 1 d.n答案 a 滿二叉樹我們講過了,度為0的節點比度為2的加點多乙個。滿二叉樹是特殊的...

每天一道演算法題

1.給定乙個只包括 的字串,判斷字串是否匹配。有效字串需滿足 左括號必須用相同型別的右括號閉合。左括號必須以正確的順序閉合。注意空字串可被認為是有效字串。思路 正確思路 不需要考慮輸入內容是否合法,這只是做題,不是工程 定義乙個字典,後括號為鍵,前半部分為值 定義乙個元素儲存棧頂,注意這個設定,取棧...

每天一道演算法題

1 js計算某個字串出現的次數 j ascript計算乙個字串最多重複的字元及出現次數.var str zhaochucichuzuiduodezifu var o for var i 0,length str.length i length i else console.log o 輸出的是完整的...