本文準(zhǔn)備講解1個(gè)算法編程問(wèn)題谨娜, 這個(gè)算法編程問(wèn)題來(lái)自LeetCode平臺(tái)渠旁。不了解.LeetCode平臺(tái)的讀者可以閱讀筆者文章(在線編程平臺(tái)推薦-LeetCode)竭翠。問(wèn)題的英文版本描述如下:
Subsets II
Given a collection of integers that might contain duplicates,nums, return all possible subsets.
Note:The solution set must not contain duplicate subsets.
For example,
Ifnums=[1,2,2], a solution is:
[ ]
[2],
[1],
[1,2,2],
[2,2],
[1,2],
問(wèn)題的中文版本描述:
重復(fù)元素子集
給定一個(gè)可能含有重復(fù)數(shù)字的列表脑蠕,返回其所有可能的子集
注意事項(xiàng)
子集中的每個(gè)元素都是非降序的
兩個(gè)子集間的順序是無(wú)關(guān)緊要的
解集中不能包含重復(fù)子集
樣例
如果 S =[1,2,2]酌泰,一個(gè)可能的答案為:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
該題目要求找出對(duì)應(yīng)目標(biāo)數(shù)據(jù)集的所有可能子集媒佣。例如對(duì)應(yīng)數(shù)據(jù)集 [1,2,2],所有的可能子集共有6個(gè)陵刹。不含任何數(shù)據(jù)的空集有1個(gè)默伍,含有1個(gè)數(shù)據(jù)的子集有2個(gè),含有2個(gè)數(shù)據(jù)的子集有2個(gè)衰琐,含有3個(gè)數(shù)據(jù)的子集有1個(gè)也糊。核心的算法為:先找數(shù)據(jù)量最多的子集,再找數(shù)據(jù)量次多的子集羡宙;并依次接續(xù)尋找對(duì)子集狸剃。例如對(duì)應(yīng)數(shù)據(jù)集 [1,2,2],先找含有3個(gè)數(shù)據(jù)的子集狗热,接著找含有2個(gè)數(shù)據(jù)的子集捕捂,接著找含有1個(gè)數(shù)據(jù)的子集瑟枫。如何由前層子集找后層子集:對(duì)應(yīng) [1,2,2],移除首個(gè)數(shù)據(jù)得到 [2,2], 移除第2個(gè)數(shù)據(jù)得到 [1,2], 移除后個(gè)數(shù)據(jù)得到 [1,2]指攒。算法要求刪除所有重復(fù)子集慷妙。
核心算法部分內(nèi)容見(jiàn)下圖: