《leetCode-php》给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集

给出一个可能包含重复元素的整数集合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);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值