手撸代码系列(五)

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

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

题目分析:以集合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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,可以使用装饰器或元类来动实现单例模式。下面是分别使用装饰器和元类实现单例模式的示例代码: 1. 使用装饰器实现单例模式: ```python def singleton(cls): instances = {} def wrapper(*args, **kwargs): if cls not in instances: instances[cls] = cls(*args, **kwargs) return instances[cls] return wrapper @singleton class SingletonClass: def __init__(self, name): self.name = name # 使用示例 a = SingletonClass("Instance A") b = SingletonClass("Instance B") print(a.name) # 输出:Instance A print(b.name) # 输出:Instance A print(a is b) # 输出:True ``` 在上述示例中,`singleton` 是一个装饰器函数,它接受一个类作为参数,并返回一个包装函数 `wrapper`。`wrapper` 函数会判断该类是否已经有实例存在,如果不存在,则创建一个新的实例并保存在 `instances` 字典中,然后返回该实例。如果已经存在实例,则直接返回已有的实例。 2. 使用元类实现单例模式: ```python class SingletonMeta(type): _instances = {} def __call__(cls, *args, **kwargs): if cls not in cls._instances: cls._instances[cls] = super().__call__(*args, **kwargs) return cls._instances[cls] class SingletonClass(metaclass=SingletonMeta): def __init__(self, name): self.name = name # 使用示例 a = SingletonClass("Instance A") b = SingletonClass("Instance B") print(a.name) # 输出:Instance A print(b.name) # 输出:Instance A print(a is b) # 输出:True ``` 在上述示例中,`SingletonMeta` 是一个元类,它继承自 `type`。通过在 `SingletonClass` 类中指定 `metaclass=SingletonMeta`,可以将 `SingletonMeta` 设置为该类的元类。在元类的 `__call__` 方法中,判断是否已经存在该类的实例,如果不存在,则创建一个新的实例并保存在 `_instances` 字典中,然后返回该实例。如果已经存在实例,则直接返回已有的实例。 以上是使用装饰器和元类两种常见的动实现单例模式的方法。这些方法可以确保只有一个实例存在,并提供了全局访问点来获取该实例。 希望这个示例对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值