手撸代码系列(五)

本文介绍了一种利用二进制法求解集合所有子集的算法,通过将集合元素的选择状态映射到二进制位上,实现对集合{A,B,C}

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

第五期:实现一个算法求某集合的所有子集(二进制法)

此博客根据哔哩哔哩中蓝桥杯相关视频,仅用于自己学习,如有侵犯版权,立马删除。

题目分析:以集合a={A,B,C}为例

所谓子集,就是在原集合中选取若干个(不大于原集合的个数)元素即可,对于每一个元素有两种状态,要么选,要么不选,可以巧妙的借助 二进制

进一步分析:
000–>ABC都不选,那么集合为{ }
001–>AB不选,C选,那么集合为{C}
010–>AC不选,B选,那么集合为{B}
011–>A不选,BC选,那么集合为{B,C}
100–>A选,BC不选,那么集合为{A}
101–>AB不选,C选,那么集合为{A,C}
110–>AB选,C不选,那么集合为{A,B}
111–>ABC都选,那么集合为{A,B,C}

Java代码:

import java.util.ArrayList;
import java.util.Arrays;
/**
 * 求一个集合的子集
 */
public class SubSet2 {
    private static ArrayList<ArrayList<Integer>> getSubsets(int[] arr, int len){
        Arrays.sort(arr);
        // 大集合,存放最后的结果
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();
        for (int i = (int)Math.pow(2,len)-1; i >= 0; i--) {
            ArrayList<Integer> temp = new ArrayList<>();
            for (int j = len-1; j >= 0 ; j--) {  // 检查哪个位置上的元素是一
                if (((i>>j)&1)==1){
                    temp.add(arr[j]);
                }
            }
            result.add(temp);
        }
        return result;
    }
    public static void main(String[] args) {
        int[] array = {1, 4, 6};
        ArrayList<ArrayList<Integer>> subsets = getSubsets(array, array.length);
        System.out.println(subsets);
    }
}
简要分析:

时间复杂度: O ( 2 n ) O({2^n}) O(2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值