求集合的子集(c ,3種方法)

2021-10-20 10:44:04 字數 1294 閱讀 8695

leetcode78 子集

給你乙個整數陣列 nums ,陣列中的元素 互不相同 。返回該陣列所有可能的子集(冪集)。

解集 不能 包含重複的子集。你可以按 任意順序 返回解集。

1.二進位制

假設乙個集合為a = ,那麼我們用三位二進位制數表示選擇的集合元素下標。

0/1序列

子集000

{}001

010100

011101

110111

可見,對於有n個元素的集合,共有2n2^

2n個子集,於是我們可以列舉

所有可能

class

solution

} ans.

push_back

(t);

}return ans;}}

;//注:這裡二進位制數的第j位是從右往左數,但是集合的第j個元素是從左往右數,

//所以對於a=,得到前幾個子集是,,而非,,

2.backtrack(回溯)

寫乙個函式void dfs(int cur,vectornums)表示遍歷到nums[cur]

對於第cur個元素是否在子集內,有兩種選擇,第一種是子集包含nums[cur],第二種是不包含該元素。

若包含該元素,**為:

t.

push_back

(nums[cur]

)dfs

(cur+

1,nums)

t.pop_back()

;

若不包含該元素,則直接dfs(cur+1,nums)

整體dfs如下

class

solution

t.push_back

(nums[cur]);

dfs(cur +

1, nums)

; t.

pop_back()

;dfs

(cur +

1, nums);}

vectorint>>

subsets

(vector<

int>

& nums)

};

3.新增子集法

對於將要遍歷的第cur個元素,將其加入已經形成的所有子集中,變成cur個新子集

class

solution

}return res;}}

;

用遞迴方法求集合的子集

用遞迴的方法求乙個集合的子集。實現 如下 include include include define n 20 int used n void output char str int diver char str,int len,int index int main void input strl...

C 3的分部方法

作用是乙個可選的鉤子,如果沒有實現,則不會有任何的開銷。比如 myform.cs partial class myform public myform partial void custominitialize partial void setup myformhandwritten.cs part...

C 3種繼承的區別

從下面的圖可以看出!繼承類中的成員,對3種屬性的訪問都是一樣的,都能訪問父類中的public和proteced,但是不能訪問private 繼承類產生的物件,除了公有繼承可以訪問public,其他2個繼承,物件都不能訪問父類的成員。保護成員和私有成員的區別就在於 保護繼承中的變化!公有繼承 物件訪問...