Leetcode分類 遞迴 回溯 分治

2021-09-17 19:01:41 字數 1941 閱讀 6589

回溯是一種應用遞迴演算法,遞迴不是

題目迴圈的困難之處在於不好模擬選不選某乙個數的過程,即選了乙個數,不方便回溯到不選這個數的情況。

給定一組不含重複元素的整數陣列 nums,返回該陣列所有可能的子集(冪集)。

說明:解集不能包含重複的子集。

示例:輸入: nums =[1

,2,3

]輸出:[[

3],[

1],[

2],[

1,2,

3],[

1,3]

,[2,

3],[

1,2]

,]

解法一:回溯法

class

solution

private

void

addelem

(int

nums,

int n, list

temp, list

> list)

//放入該元素

temp.

add(nums[n]);

addelem

(nums, n +

1, temp, list)

;//回溯,不放入該元素

temp.

remove

(temp.

size()

-1);

addelem

(nums, n +

1, temp, list);}

}

方法二:位運算

位運算介紹:

這裡的集合有三個元素a、b、c,則三個元素共有2^3=8種組成集合的方式,於是可以用0(000)~7(111)來表示這些集合。

集合整數ab

c{}000=000

0001=100

1010=201

0011=301

1100=410

0101=510

1110=611

0111=711

1a元素為100=4,b元素為010=2,c元素為001=1。如需判斷乙個集合是否含有該元素,將這個集合的二進位制表示與該元素的二進位制表示做**&運算**,結果為真時,表示包含該元素,將其push進集合內。

9

-10000000008-

01000000007-

00100000006-

00010000005-

00001000004-

00000100003-

00000010002-

00000001001-

00000000100-

000000000198

7654

321組合共有2^10

=1024種

題目

利用set將list中相同的list剔除。

class

solution

private

void

addelem

(int

nums,

int n, list

temp, list

> list)

temp.

add(nums[n]);

addelem

(nums, n +

1, temp, list)

; temp.

remove

(temp.

size()

-1);

addelem

(nums, n +

1, temp, list);}

}

Leetcode 遞迴 回溯

又稱試探法,即走不通就退回再走 當探索到某一步走不動時,發現原先選擇達不到目標,就退回一步重新選擇.用棧是否可以?數字 n 代表生成括號的對數,請你設計乙個函式,用於能夠生成所有可能的並且 有效的 括號組合。示例 1 輸入 n 3 輸出 示例 2 輸入 n 1 輸出 1 n 8 class solu...

leetcode 遞迴 回溯問題 總結

注意 整體思路清晰,回溯的過程大概是怎樣的 每層遞迴實際上要解決的問題是什麼 一定記住,該重置的狀態要重置,因為回溯就是相當於在每一層的遞迴中做選擇,選擇了不同的選項,在遇到阻礙或者達到條件結束遞迴之後,再想嘗試其他的選擇路徑,應當記住回退到之前的狀態。縱向 遞迴的深度,完整地解決問題 搜尋完所有的...

遞迴 回溯 leetcode原題講解

從大學就一直對遞迴很迷糊,想不清楚,最近刷leetcode這又是繞不過去的彎,索性這次認真研究一下並做個總結。這裡關於回溯講解的比較容易懂。大概總結一下總有乙個套路 定義乙個全域性結果用於儲存最終的答案ans 定義乙個輔助方法 函式 void backtrack 一般引數都有乙個儲存中間值的temp...