LeetCode 0090.子集 II:二进制枚举 / 回溯

news2025/2/6 22:54:49

【LetMeFly】90.子集 II:二进制枚举 / 回溯

力扣题目链接:https://leetcode.cn/problems/subsets-ii/

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。

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

 

示例 1:

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

示例 2:

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

 

提示:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10

解题方法一:位运算(二进制枚举)

使用变量 s t a t e state state 0 0 0枚举到 2 n − 1 2 ^ n - 1 2n1,其中 s t a t e state state二进制下的每一位代表选择 n u m s [ i ] nums[i] nums[i]或不选。

枚举之前先将 n u m s nums nums排序,若当前选择方案不存在则加入答案数组中。

  • 时间复杂度 O ( n log ⁡ n + n 2 × 2 n ) O(n\log n + n^2\times2^n) O(nlogn+n2×2n),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( n ) O(n) O(n),返回值不计入

AC代码

C++
/*
 * @Author: LetMeFly
 * @Date: 2025-02-05 12:22:09
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-05 12:24:34
 */
class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        vector<vector<int>> ans;
        for (int i = 0; i < (1 << nums.size()); i++) {
            vector<int> thisAns;
            for (int j = 0; j < nums.size(); j++) {
                if (i >> j & 1) {
                    thisAns.push_back(nums[j]);
                }
            }
            if (find(ans.begin(), ans.end(), thisAns) == ans.end()) {
                ans.push_back(thisAns);
            }
        }
        return ans;
    }
};

解题方法二:回溯

类似LeetCode 40.组合总和 II:回溯 + 剪枝,写一个dfs函数枚举选与不选两种情况。

  • 如果当前下标已越界,则将当前方案添加到答案数组中
  • 选当前元素时,将当前元素加入当前方案,递归,再将当前元素移除当前方案(回溯)
  • 不选当前元素时,如果下一个元素(下下个元素,…)和当前元素一样,那么也不能选。

以上。

  • 时间复杂度 O ( n × 2 n ) O(n^\times2^n) O(n×2n),其中 n = l e n ( n u m s ) n=len(nums) n=len(nums)
  • 空间复杂度 O ( n ) O(n) O(n),返回值不计入

AC代码

C++
/*
 * @Author: LetMeFly
 * @Date: 2025-02-05 12:25:14
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-05 12:28:24
 */
class Solution {
private:
    vector<vector<int>> ans;
    vector<int> now;

    void dfs(vector<int>& a, int loc) {
        if (loc == a.size()) {
            ans.push_back(now);
            return;
        }
        // 选当前
        now.push_back(a[loc]);
        dfs(a, loc + 1);
        now.pop_back();
        // 不选当前
        int next = loc + 1;
        while (next < a.size() && a[loc] == a[next]) {
            next++;
        }
        dfs(a, next);
    }
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        dfs(nums, 0);
        return ans;
    }
};
Python
'''
Author: LetMeFly
Date: 2025-02-05 12:29:11
LastEditors: LetMeFly.xyz
LastEditTime: 2025-02-05 12:32:04
'''
from typing import List

class Solution:
    def dfs(self, loc: int) -> None:
        if loc == len(self.a):
            self.ans.append([i for i in self.now])
            return
        # 选当前
        self.now.append(self.a[loc])
        self.dfs(loc + 1)
        self.now.pop()
        # 不选当前
        next = loc + 1
        while next < len(self.a) and self.a[next] == self.a[loc]:
            next += 1
        self.dfs(next)
    
    def subsetsWithDup(self, nums: List[int]) -> List[List[int]]:
        self.ans: List[List[int]] = []
        self.a = sorted(nums)
        self.now = []
        self.dfs(0)
        return self.ans
Java
/*
 * @Author: LetMeFly
 * @Date: 2025-02-05 12:29:23
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-05 12:38:09
 */
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;

class Solution {
    private List<List<Integer>> ans = new ArrayList<>();
    private List<Integer> now = new ArrayList<>();
    private int[] a;

    private void dfs(int loc) {
        if (loc == a.length) {
            ans.add(new ArrayList<>(now));
            return;
        }
        // 选当前
        now.add(a[loc]);
        dfs(loc + 1);
        now.remove(now.size() - 1);
        // 不选
        int next = loc + 1;
        while (next < a.length && a[next] == a[loc]) {
            next++;
        }
        dfs(next);
    }

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        a = nums;
        dfs(0);
        return ans;
    }
}
Go
/*
 * @Author: LetMeFly
 * @Date: 2025-02-05 12:29:25
 * @LastEditors: LetMeFly.xyz
 * @LastEditTime: 2025-02-05 12:42:51
 */
package main

import "sort"

var (
    ans [][]int
    now,
    a []int
)

func dfs_S2(loc int) {
    if loc == len(a) {
        ans = append(ans, append([]int{}, now...))
        return
    }
    // 选
    now = append(now, a[loc])
    dfs_S2(loc + 1)
    now = now[:len(now) - 1]
    // 不选
    next := loc + 1
    for next < len(a) && a[next] == a[loc] {
        next++
    }
    dfs_S2(next)
}

func subsetsWithDup(nums []int) [][]int {
    ans = make([][]int, 0)
    now = make([]int, 0)
    sort.Ints(nums)
    a = nums
    dfs_S2(0)
    return ans
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

Tisfy:https://letmefly.blog.csdn.net/article/details/145453136

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2293988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE求职Demo开发日志#22 显示人物信息,完善装备的穿脱

1 创建一个人物信息显示的面板&#xff0c;方便测试 简单弄一下&#xff1a; UpdateInfo函数&#xff1a; 就是获取ASC后用属性更新&#xff0c;就不细看了 2 实现思路 在操作目标为装备栏&#xff0c;或者操作起点为装备栏时&#xff0c;交换前先判断能否交换&#xff08;只…

如何安装PHP依赖库 更新2025.2.3

要在PHP项目中安装依赖&#xff0c;首先需要确保你的系统已经安装了Composer。Composer是PHP的依赖管理工具&#xff0c;它允许你声明项目所需的库&#xff0c;并管理它们。以下是如何安装Composer和在PHP项目中安装依赖的步骤&#xff1a; 一. 安装Composer 对于Windows用户…

java求职学习day28

XML 1. XML基本介绍 1.1 概述 XML 即可扩展标记语言&#xff08; Extensible Markup Language &#xff09; (1)W3C 在 1998 年 2 月发布 1.0 版本&#xff0c; 2004 年 2 月又发布 1.1 版本&#xff0c;但因为 1.1 版本不能向下兼容 1.0 版本&#xff0c;所以1.1 没有人用。…

2022ACMToG | 寻找快速的去马赛克算法

文章标题&#xff1a;Searching for Fast Demosaicking Algorithms 1. Abstract 本文提出了一种方法&#xff0c;用于在给定损失函数和训练数据的情况下&#xff0c;自动合成高效且高质量的去马赛克算法&#xff0c;涵盖各种计算开销。该方法执行多目标的离散-连续优化&#x…

渗透测试之文件包含漏洞 超详细的文件包含漏洞文章

目录 说明 通常分为两种类型&#xff1a; 本地文件包含 典型的攻击方式1&#xff1a; 影响&#xff1a; 典型的攻击方式2&#xff1a; 包含路径解释&#xff1a; 日志包含漏洞&#xff1a; 操作原理 包含漏洞读取文件 文件包含漏洞远程代码执行漏洞: 远程文件包含…

机器学习8-卷积和卷积核1

机器学习8-卷积和卷积核1 卷积与图像去噪卷积的定义与性质定义性质卷积的原理卷积步骤卷积的示例与应用卷积的优缺点优点缺点 总结 高斯卷积核卷积核尺寸的设置依据任务类型考虑数据特性实验与调优 高斯函数标准差的设置依据平滑需求结合卷积核尺寸实际应用场景 总结 图像噪声与…

Android --- handler详解

handler 理解 handler 是一套Android 消息传递机制&#xff0c;主要用于线程间通信。 tips&#xff1a; binder/socket 用于进程间通信。 参考&#xff1a; Android 进程间通信-CSDN博客 handler 就是主线程在起了一个子线程&#xff0c;子线程运行并生成message &#xff0c;l…

DeepSeek:全栈开发者视角下的AI革命者

目录​​​​​​​ DeepSeek&#xff1a;全栈开发者视角下的AI革命者 写在前面 一、DeepSeek的诞生与定位 二、DeepSeek技术架构的颠覆性突破 1、解构算力霸权&#xff1a;从MoE架构到内存革命 2、多模态扩展的技术纵深 3、算法范式的升维重构 4、重构AI竞争规则 三、…

Page Assist - 本地Deepseek模型 Web UI 的安装和使用

Page Assist Page Assist是一个开源的Chrome扩展程序&#xff0c;为本地AI模型提供一个直观的交互界面。通过它可以在任何网页上打开侧边栏或Web UI&#xff0c;与自己的AI模型进行对话&#xff0c;获取智能辅助。这种设计不仅方便了用户随时调用AI的能力&#xff0c;还保护了…

Spring Boot篇

为什么要用Spring Boot Spring Boot 优点非常多&#xff0c;如&#xff1a; 独立运行 Spring Boot 而且内嵌了各种 servlet 容器&#xff0c;Tomcat、Jetty 等&#xff0c;现在不再需要打成 war 包部署到 容器 中&#xff0c;Spring Boot 只要打成一个可执行的 jar 包就能独…

基于SpringBoot的在线远程考试系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

python实现多路视频,多窗口播放功能

系列Python开发 文章目录 系列Python开发前言一、python实现多路视频播放功能二、代码实现1. http申请视频流地址并cv2播放功能 三、打包代码实现生成可执行文件 总结 前言 一、python实现多路视频播放功能 服务端开发后通常需要做功能测试、性能测试&#xff0c;通常postman、…

Java设计模式:行为型模式→责任链模式

Java 责任链模式详解 1. 定义 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;是一种行为型设计模式&#xff0c;它使多个对象都有机会处理请求&#xff0c;而不是由一个对象去处理这个请求。这种模式以链表的形式将多个处理对象串联起来&#xff0c;并通…

2025年02月05日Github流行趋势

项目名称&#xff1a;OCRmyPDF 项目地址url&#xff1a;https://github.com/ocrmypdf/OCRmyPDF项目语言&#xff1a;Python历史star数&#xff1a;15872今日star数&#xff1a;157项目维护者&#xff1a;jbarlow83, fritz-hh, apps/dependabot, mawi12345, mara004项目简介&…

关于大数据

在大数据背景下存在的问题&#xff1a; 非结构化、半结构化数据&#xff1a;NoSQL数据库只负责存储&#xff1b;程序处理时涉及到数据移动&#xff0c;速度慢 是否存在一套整体解决方案&#xff1f; 可以存储并处理海量结构化、半结构化、非结构化数据 处理海量数据的速…

离散浣熊优化算法(DCOA)求解大规模旅行商问题(Large-Scale Traveling Salesman Problem,LTSP),MATLAB代码

大规模旅行商问题&#xff08;Large-Scale Traveling Salesman Problem&#xff0c;LTSP&#xff09;是经典旅行商问题&#xff08;TSP&#xff09;在规模上的扩展&#xff0c;是一个具有重要理论和实际意义的组合优化问题&#xff1a; 一、问题定义 给定一组城市和它们之间的…

Page Assist实现deepseek离线部署的在线搜索功能

前面文章Mac 基于Ollama 本地部署DeepSeek离线模型 实现了deepseek的离线部署&#xff0c;但是部署完成虽然可以进行问答和交互&#xff0c;也有thinking过程&#xff0c;但是没办法像官方一样进行联网搜索。今天我们介绍一款浏览器插件Page Assist来实现联网搜索&#xff0c;完…

win10系统安装和部署DeepSeek以及python实现

DeepSeek之python实现API应用 1、下载和安装 https://github.com/ollama/ollama/releases/latest/download/OllamaSetup.exe 傻瓜式安装 2、测试安装成功 ollama -v3、拉取模型 选择模型版本:1.5B 版本适合配置一般、想尝鲜、轻度使用的用户;8B 版本适合 16GB 内存以上…

C++六大默认成员函数

C六大默认成员函数 默认构造函数默认析构函数RAII技术RAII的核心思想优点示例应用场景 默认拷贝构造深拷贝和浅拷贝 默认拷贝赋值运算符移动构造函数&#xff08;C11起&#xff09;默认移动赋值运算符&#xff08;C11起&#xff09;取地址及const取地址操作符重载取地址操作符重…

3D图形学与可视化大屏:什么是片段着色器,有什么作用。

一、片段着色器的概念 在 3D 图形学中&#xff0c;片段着色器&#xff08;Fragment Shader&#xff09;是一种在图形渲染管线中负责处理片段&#xff08;像素&#xff09;的程序。它的主要任务是确定每个像素的颜色和其他属性&#xff0c;如透明度、深度等。片段着色器是可编程…