【算法学习】剑指 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 博客原创~

相关文章
|
16天前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
31 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
14天前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
34 2
|
18天前
|
算法 搜索推荐 开发者
别再让复杂度拖你后腿!Python 算法设计与分析实战,教你如何精准评估与优化!
在 Python 编程中,算法的性能至关重要。本文将带您深入了解算法复杂度的概念,包括时间复杂度和空间复杂度。通过具体的例子,如冒泡排序算法 (`O(n^2)` 时间复杂度,`O(1)` 空间复杂度),我们将展示如何评估算法的性能。同时,我们还会介绍如何优化算法,例如使用 Python 的内置函数 `max` 来提高查找最大值的效率,或利用哈希表将查找时间从 `O(n)` 降至 `O(1)`。此外,还将介绍使用 `timeit` 模块等工具来评估算法性能的方法。通过不断实践,您将能更高效地优化 Python 程序。
32 4
|
16天前
|
机器学习/深度学习 人工智能 算法
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台。果蔬识别系统,本系统使用Python作为主要开发语言,通过收集了12种常见的水果和蔬菜('土豆', '圣女果', '大白菜', '大葱', '梨', '胡萝卜', '芒果', '苹果', '西红柿', '韭菜', '香蕉', '黄瓜'),然后基于TensorFlow库搭建CNN卷积神经网络算法模型,然后对数据集进行训练,最后得到一个识别精度较高的算法模型,然后将其保存为h5格式的本地文件方便后期调用。再使用Django框架搭建Web网页平台操作界面,实现用户上传一张果蔬图片识别其名称。
36 0
【果蔬识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
20天前
|
缓存 算法 数据处理
时间&空间复杂度,Python 算法的双重考验!如何优雅地平衡两者,打造极致性能?
在Python算法中,时间与空间复杂度的平衡至关重要。时间复杂度反映算法执行时间随输入规模的变化趋势,空间复杂度则关注额外存储空间的需求。优秀的算法需兼顾两者,如线性搜索时间复杂度为O(n),空间复杂度为O(1);二分查找在时间效率上显著提升至O(log n),空间复杂度保持为O(1);动态规划通过牺牲O(n)空间换取O(n)时间内的高效计算。实际应用中,需根据具体需求权衡,如实时数据处理重视时间效率,而嵌入式系统更关注空间节约。通过不断优化,我们能在Python中找到最佳平衡点,实现高性能程序。
43 3
|
机器学习/深度学习 人工智能 安全
Go vs Python,我该选哪一门语言?
哪个更好,Python 还是 Go?你今天应该学习哪种语言,为什么?两者在性能、易学习性、可扩展性和快速原型设计方面如何比较?让我们在 Python 和 Go 的这个友好且易于访问的概述中找出答案。
Go vs Python,我该选哪一门语言?
|
Java Linux Go
再见,Python!你好,Go语言
Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了很多基于 Go 的应用。
2242 0
|
1天前
|
iOS开发 MacOS Python
Python 编程案例:谁没交论文?输出并生成电子表格
Python 编程案例:谁没交论文?输出并生成电子表格
17 9
|
1天前
|
IDE 开发工具 iOS开发
Python编程案例:查找指定文件大小的文件并输出路径
Python编程案例:查找指定文件大小的文件并输出路径
10 3
|
1天前
|
文件存储 iOS开发 MacOS
Python编程案例:文件查找并归类
Python编程案例:文件查找并归类