用DFS(廣度優先遍歷)解決組合問題

2021-09-03 08:46:17 字數 1312 閱讀 1347

從元素集中選取幾個元素構成子集,求解可以構成子集的數目,與排列的主要區別是子集中元素順序不同視為同乙個子集

解題思路:

解題時要注意進行剪枝處理,與排列問題解法的區別是對每次迭代要重新設定起始值,避免出現新增了之前的元素造成順序不同的同乙個子集被新增到答案中的情況。

如果沒有重複元素,不需要用陣列對訪問過的元素進行標記,因為剪枝過程可以避免訪問到之前的新增過的元素。

如果有重複元素,需要對原始陣列進行排序,每次遍歷元素需要標記,因為需要判斷重複元素和第乙個出現的元素是否同時出現在乙個子集中,如果沒有,這個重複元素可以跳過。

leetcode上經典應用題目:

77 組合(沒有重複元素)

輸入:n = 4 , k = 2

輸出:[

[2,4],

[3,4],

[2,3],

[1,2],

[1,3],

[1,4],

]

public list> combine(int n, int k) 

private void backtracking(listcombinelist, list> combinations, int start, int k, final int n)

for (int i = start; i <= n - k + 1; i++)

}

90 含有相同元素求子集

輸入:nums = [1,2,2]

輸出:[

[2],

[1],

[1,2,2],

[2,2],

[1,2],

]

public list> subsetswithdup(int nums) 

return subsets;

}private void backtracking(int start, listtempsubset, list> subsets, boolean hasvisited,

final int size, final int nums)

for (int i = start; i < nums.length; i++)

tempsubset.add(nums[i]);

hasvisited[i] = true;

backtracking(i + 1, tempsubset, subsets, hasvisited, size, nums);

hasvisited[i] = false;

tempsubset.remove(tempsubset.size() - 1);

}}

用DFS(廣度優先遍歷)解決排列問題

例如有 三個字元,求解所有由這三個字元排列得到的字串。解題思路 一次排列中已經遍歷過的元素不能重複遍歷,因此需要對新增過的元素進行標記,避免本次排列出現重複。這種問題在一次排列求解完成之後還需要繼續求解,在本次排列結束後,為了保證已經訪問過但是不在當前遞迴鏈中的元素可以繼續被訪問,需要對這個元素取消...

用DFS解決組合問題

一直以來,大量做各類管理系統的程式設計師,大量的時間都在處理各類增刪改查問題,對於其他的方面尤其是演算法層面的涉及較少,這次就遇到乙個問題。使用者上傳乙份excel,讓使用者選擇其中的部分列頭,程式對列頭做兩兩組合,並對所有的組合取excel表中的資料,繪製乙個折線圖。檔案上傳。前端使用非同步外掛程...

用廣度優先搜尋方法解決放置炸彈遊戲

炸彈遊戲規則 在乙個n n的方陣裡,每乙個方格分別代表空地,敵人,牆,三種元素的分布為隨機分布,現在玩家要從地圖的某乙個空地 已知座標點 出發,走到乙個空地上放置炸彈,炸彈可以炸毀該點對應行列上的所有敵人,但是炸彈不能炸穿牆,要求的是玩家在哪乙個點放置炸彈能夠炸掉最多敵人,最多炸幾個?注意 必須考慮...