DFS實現排列組合

2022-02-05 17:03:42 字數 1068 閱讀 4198

所謂排列,是指從給定的元素序列中依次取出元素,需要考慮取出順序。比如,取出元素3, 5,因取出順序的不同,則形成的序列與是不同的排列序列。對於長度為n的元素序列取出k個元素,則共有a(n, k)種取法。所謂組合,也是從元素序列中依次取出元素,與排列不同的是不需要考慮取出順序;因此其取法數為c(n, k)。

leetcode有兩個問題分屬於組合、排列:77. combinations 與 46. permutations。

要求給出對於序列1~n 的取出k個元素的各種取法。採用dfs模擬組合時,可看做節點i與節點j(j = i+1, … , n)都相連線,然後dfs遍歷整張有向圖,**實現如下:

public list> combine(int n, int k) 

listtmp = new arraylist<>();

dfs(n, k, 1, tmp, result);

return result;

}// dfs for combination

private void dfs(int n, int k, int start,

listtmp, list> result)

for (int i = start; i <= n; i++)

}

dfs實現排列與組合相類似,唯一不同之處在於,節點i與其他所有節點都連線。因此,所構造的圖是乙個完全連通圖。dfs實現排列如下:

public list> permute(int nums) 

listtmp = new arraylist<>();

dfs(nums, tmp, result);

return result;

}// dfs for permutation

private void dfs(int nums, listtmp,

list> result)

for (int i = 0; i < n; i++)

}}

上述**中,可以用乙個visit陣列來標記節點是否被訪問,這樣優化將contains的時間複雜度從\(o(n)\)優化到\(o(1)\)。

DFS排列組合

初學,加強一下理解 每次dfs都是從1到n中 選出乙個數放在排列中第x個位置 void dfs int x int main void for int i 1 i r i dfs 1 關於回溯 我們可以以乙個1到3的全排列為例,則全排列過程可以想象為你穿過三層牆,每層牆都有三個編號為1 2 3的門,...

dfs排列組合問題

這幾天回顧了一下dfs演算法。這個演算法我覺得挺重要的,思想很基礎,是以後學習很多演算法的基礎吧,簡而言之就是遞迴,才開始接觸肯定會覺得,哇,很神奇,不知道怎麼做到的,其實只需要多加練習就可以了,當初我開始刷題的時候也是懵了很久。深度優先首先接觸來自於學資料結構的圖。深度優先是一種遍歷搜尋的方法。它...

排列組合實現

演算法 與網際網路 組合演算法 本程式的思路是開乙個陣列,其下標表示1到m個數,陣列元素的值為1表示其下標 代表的數被選中,為0則沒選中。首先初始化,將陣列前n個元素置1,表示第乙個組合為前n個數。然後從左到右掃瞄陣列元素值的 10 組合,找到第乙個 10 組合後將其變為 01 組合,同時將其左邊的...