位运算解决子集问题

本文详细解析了LeetCode上经典子集问题的求解思路,通过使用位运算技巧,生成给定数组的所有可能子集,包括空集。示例中以数组[1,2,3]为输入,展示了如何通过遍历从0到111(二进制表示)的每一个数,检查每一位是否为1来决定是否选择对应位置的元素。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目来源:力扣(LeetCode)
思路来源LeetCode 78. 子集

题目

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。

输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

思路简述

用 0 和 1 来代表每位数选还是不选,对于三个数字的子集, 就是从 0 到 111 即(1000 - 1), 判断每位数是否是 1 ,判断当前数是否选择。
000 三个数都没选
001 选了三号数
010 选了二号数
011 选了二、三号数
100 选了一号数
101 选了一、三号数
110 选了一、二号数
111 三个数都选了

代码

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();//数组列表
        for(int i = 0; i < (1 << nums.length); i++){//得到每个数选和不选的所有可能
            List<Integer> sub = new ArrayList<>();//数组
            for(int j = 0; j < nums.length; j++){//每一位选了还是没选
                if(((i >> j) & 1) == 1){//选了
                    sub.add(nums[j]);//那一位的数字加进来
                }
            }
            res.add(sub);//每次的数组加进来
        }
        return res;//返回结果
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值