【算法学习】剑指 Offer II 079. 所有子集|78. 子集(java / c / c++ / python / go / rust)

简介: 给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

剑指 Offer II 079. 所有子集|78. 子集:

给定一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

样例 1

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

样例 2

输入:
    nums = [0]
    
输出:
    [[],[0]]

提示

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • nums 中的所有元素 互不相同

分析

  • 这道算法题用递归我觉得相对比较简单,深度优先,但是二当家的偏不。
  • 根据题意,所有子集就是每个数字都可以选择或者不选,取所有的可能组合,都不选也是一个组合,也是一个子集。
  • 题目中说不能包含重复题解,这个理所当然。
  • 提示中说每个数字各不相同,那我们子集就可以考虑成数字所在位置或者说是数组的下标的不同组合,因为数字都不同,所以我们就不必关心每个数字是几了。
  • 每个位置都有两种情况,选择或者不选择,这种熟悉的味道,情况与二进制不能说毫无关系,可以说是一模一样,我们已经可以推算题解的个数就是 2nums.length,也就是 1 << nums.length 。
  • 提示中还说数字个数最多10个,那我们最多用10个二进制位就可以表示所有数字的选择和不选择,一个 int 型变量足以,我们用这个 int 型变量的二进制位变化,去对应数字的选择和不选择。

题解

java

class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> ans = new ArrayList<>();

        int n = 1 << nums.length;
        for (int i = 0; i < n; ++i) {
            List<Integer> ansRow = new ArrayList<>();
            for (int j = 0; j < nums.length; ++j) {
                if (((i >> j) & 1) != 0) {
                    ansRow.add(nums[j]);
                }
            }
            ans.add(ansRow);
        }

        return ans;
    }
}

c

/**
 * Return an array of arrays of size *returnSize.
 * The sizes of the arrays are returned as *returnColumnSizes array.
 * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 */
int** subsets(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){
    int n = 1 << numsSize;
    *returnSize = n;
    // 结果
    int **ans = (int **) malloc(sizeof(int *) * n);
    // 每行结果的长度
    *returnColumnSizes = (int *) malloc(sizeof(int) * n);
    for (int i = 0; i < n; ++i) {
        // 这里不满的行都会浪费内存,烦死
        ans[i] = (int *) malloc(sizeof(int) * numsSize);
        (*returnColumnSizes)[i] = 0;
        for (int j = 0; j < numsSize; ++j) {
            if ((i >> j) & 1) {
                ans[i][(*returnColumnSizes)[i]++] = nums[j];
            }
        }
    }
    return ans;
}

c++

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;

        int m = nums.size();
        int n = 1 << m;
        for (int i = 0; i < n; ++i) {
            vector<int> ansRow;
            for (int j = 0; j < m; ++j) {
                if ((i >> j) & 1) {
                    ansRow.push_back(nums[j]);
                }
            }
            ans.push_back(ansRow);
        }

        return ans;
    }
};

python

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        m = len(nums)
        n = 1 << m
        ans = []
        for i in range(n):
            row = []
            for j in range(m):
                if (i >> j) & 1:
                    row.append(nums[j])
            ans.append(row)
        return ans
        

go

func subsets(nums []int) [][]int {
    ans := make([][]int, 0)

    m := len(nums)
    n := 1 << m
    for i := 0; i < n; i++ {
        row := make([]int, 0)
        for j := 0; j < m; j++ {
            if ((i >> j) & 1) != 0 {
                row = append(row, nums[j])
            }
        }
        ans = append(ans, row)
    }

    return ans
}

rust

impl Solution {
    pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
        let mut ans: Vec<Vec<i32>> = Vec::new();

        let m = nums.len();
        let n = 1 << m;
        (0..n).for_each(|i|{
            let mut row:Vec<i32> = Vec::new();
            
            nums.iter().enumerate().for_each(|(j, num)| {
                if ((i >> j) & 1) != 0 {
                    row.push(*num);
                }
            });

            ans.push(row);
        });

        ans
    }
}

在这里插入图片描述


原题传送门:https://leetcode-cn.com/problems/TVdhkn/

原题传送门:https://leetcode-cn.com/problems/subsets/


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
算法 搜索推荐 JavaScript
基于python智能推荐算法的全屋定制系统
本研究聚焦基于智能推荐算法的全屋定制平台网站设计,旨在解决消费者在个性化定制中面临的选择难题。通过整合Django、Vue、Python与MySQL等技术,构建集家装设计、材料推荐、家具搭配于一体的一站式智能服务平台,提升用户体验与行业数字化水平。
|
存储 算法 调度
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
【复现】【遗传算法】考虑储能和可再生能源消纳责任制的售电公司购售电策略(Python代码实现)
621 26
|
存储 监控 算法
监控电脑屏幕的帧数据检索 Python 语言算法
针对监控电脑屏幕场景,本文提出基于哈希表的帧数据高效检索方案。利用时间戳作键,实现O(1)级查询与去重,结合链式地址法支持多条件检索,并通过Python实现插入、查询、删除操作。测试表明,相较传统列表,检索速度提升80%以上,存储减少15%,具备高实时性与可扩展性,适用于大规模屏幕监控系统。
355 5
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
567 1
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
313 1
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
1001 0
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
1130 8
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
225 5
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
313 5
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
395 3

热门文章

最新文章

推荐镜像

更多