给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:
- 你给出的子集中的元素要按非递增的顺序排列
- 给出的解集中不能包含重复的子集
例如: 如果S =[1,2,2], 给出的解集应该是:[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]
思路:如果没有重复的,可以采用二进制的方式遍历获得所有的子集。有重复的就需要去掉重复的集合,
状态方程为 subsets[i] = subsets[i -1] 后面加上 num[i];subsets代表的是新增的集合,其中单个的集合需要单独处理。
注意去重。
<?php
function subsetsWithDup($arrNum) {
$arrSubset = array(-1 => [[]]);
$newSubset = array(-1 => [[]]);
foreach ($arrNum as $i => $num) {
$arrSubset[$i] = $arrSubset[$i - 1];
$flag = 0;
foreach ($newSubset[$i - 1] as $item) {
if ((count($item) == 1 && $num == current($item)) || $i == 0) {
$flag = 1;
}
$item[] = $num;
$newSubset[$i][] = $item;
}
if ($flag == 0) {
$newSubset[$i][] = [$num];
}
$arrSubset[$i] = array_merge($arrSubset[$i], $newSubset[$i]);
}
return array_unique($arrSubset[count($arrNum) - 1], SORT_REGULAR);
}
$arr = [1,2,2,2];
$ret = subsetsWithDup($arr);
print_r($ret);