【Leetcode】78 子集 | 保存遍历路径上的所有节点 // 46 排列 | 使用辅助数组记录元素是否使用

news2024/12/28 20:03:10

78 子集

与组合问题相比,需要保存路上经过的所有节点。

78.子集

写法1

分为选择第 i i i个元素和不选择第 i i i个元素两种情况递归。

每push进一个元素,代表进入了一个新的节点,就保存当前的路径。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

class Solution {
    Stack<Integer> set = new Stack<>();
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> subsets(int[] nums) {
        // 空集
        res.add(new ArrayList<>());
        DFS(nums, 0);
        return res;
    }

    public void DFS(int[] nums, int i) {
        // 从DFS[i: n]遍历可得到的子集
        if (i == nums.length) {
            return;
        }

        // 选择第i个元素
        set.push(nums[i]);
        res.add(new ArrayList<>(set));
        DFS(nums, i + 1);

        // 不选择第i个元素
        set.pop();
        DFS(nums, i + 1);
    }
}

写法2

写成循环的形式。

含1的子集;不含1含2的子集,不含12含3的子集……

栗子, { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{1,2,3,4,5,6,7,8,9,10\} {1,2,3,4,5,6,7,8,9,10}的子集:

  • 选择1,加上 { 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{2,3,4,5,6,7,8,9,10\} {2,3,4,5,6,7,8,9,10}的所有子集;
  • 选择2,加上 { 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{3,4,5,6,7,8,9,10\} {3,4,5,6,7,8,9,10}的所有子集;
  • 选择3,加上 { 4 , 5 , 6 , 7 , 8 , 9 , 10 } \{4,5,6,7,8,9,10\} {4,5,6,7,8,9,10}的所有子集;
  • … \dots
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

class Solution {
    Stack<Integer> set = new Stack<>();
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> subsets(int[] nums) {
        // 空集
        res.add(new ArrayList<>());
        DFS(nums, 0);
        return res;
    }

    public void DFS(int[] nums, int start) {
        // 从DFS[i: n]遍历可得到的子集
        if (start == nums.length) {
            return;
        }

        for (int i = start;  i < nums.length; i++) {
            // 选择第i个元素
            set.push(nums[i]);
            res.add(new ArrayList<>(set));
            DFS(nums, i + 1);
            set.pop();
        }
    }
}

90 子集Ⅱ

与组合总和Ⅱ去重很像,基本是一样的思路。

先排序,然后同层中遍历的树枝值不可以相同。

去重的key:i > start && nums[i] == nums[i - 1]时continue,这样保证了同一层中不会有相同值的树枝。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

class Solution {
    Stack<Integer> path = new Stack<>();
    List<List<Integer>> res = new ArrayList<>();

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums);
        res.add(new ArrayList<>());
        DFS(nums, 0);
        return res;
    }

    public void DFS(int[] nums, int start) {
        // nums[start:]的所有子集
        if (start >= nums.length) {
            return;
        }

        for (int i = start; i < nums.length; i++) {
            // 如果与上一个元素相同,不要再递归访问啦
            if (i > start && nums[i - 1] == nums[i]) {
                continue;
            }

            path.push(nums[i]);
            res.add(new ArrayList<>(path));
            DFS(nums, i + 1);
            path.pop();
        }
    }
}

46 全排列

数字不重复。

使用辅助数组used,递归终止条件为stack.size() == nums.length

遍历每个数字,判断是否被使用过,没有使用过的话就加入并继续向下递归。

import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

class Solution {
    boolean[] used;
    Stack<Integer> stack = new Stack<>();
    List<List<Integer>> res = new ArrayList<>();
    int[] nums;

    public List<List<Integer>> permute(int[] nums) {
        used = new boolean[nums.length];
        this.nums = nums;
        DFS();
        return res;
    }

    public void DFS() {
        if (stack.size() == nums.length) {
            res.add(new ArrayList<>(stack));
            return;
        }
        // 没有办法,只能遍历每个数字,判断是否被使用过,没有使用过的话就加入并继续向下递归
        for (int i = 0; i < nums.length; i++) {
            if (used[i]) {
                continue;
            }
            stack.push(nums[i]);
            used[i] = true;
            DFS();
            stack.pop();
            used[i] = false;
        }
    }
}

47 全排列Ⅱ

去重思路和之前做过的很像,在同一层中不重复访问数字。同一层的相同树枝去重。

关键在于:

			// 如果和前一个数字相同,并且在这一层中,前一个数字已经被遍历过
            // !used[i - 1]代表与前一个数字不在同一个递归子树上
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
                continue;
            }

因为前一个如果未被used过,说明前一个数字的树枝已经被访问过,且与当前数字不在同一树枝,不必再遍历。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Stack;

class Solution {
    boolean[] used;
    Stack<Integer> stack = new Stack<>();
    List<List<Integer>> res = new ArrayList<>();
    int[] nums;


    public List<List<Integer>> permuteUnique(int[] nums) {
        this.nums = nums;
        this.used = new boolean[nums.length];
        Arrays.sort(this.nums);
        DFS();
        return res;
    }

    public void DFS() {
        if (stack.size() == nums.length) {
            res.add(new ArrayList<>(stack));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            // 如果这个数字已经被使用过,跳过
            if (used[i]) {
                continue;
            }
            // 如果和前一个数字相同,并且在这一层中,前一个数字已经被遍历过
            // !used[i - 1]代表与前一个数字不在同一个递归子树上
            if (i > 0 && nums[i] == nums[i - 1] && !used[i - 1]) {
                continue;
            }
            used[i] = true;
            stack.push(nums[i]);
            DFS();
            stack.pop();
            used[i] = false;
        }
    }
}

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

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

相关文章

JUC基础-0606

9.ReentrantReadWriteLock读写锁 9.1 锁的基本概念 悲观锁&#xff1a;不支持并发&#xff0c;效率低&#xff0c;但是可以解决所有并发安全问题 乐观锁&#xff1a;支持并发读&#xff0c;维护一个版本号&#xff0c;写的时候比较版本号进行控制&#xff0c;先提交的版本号…

chatgpt赋能python:Python配置指南:提高SEO效果的关键

Python配置指南&#xff1a;提高SEO效果的关键 Python作为一种高效、易学易用的编程语言&#xff0c;在数据科学、机器学习、网络编程等领域得到了广泛应用。作为一个网站管理员&#xff0c;如何让Python支持的应用程序尽可能地符合搜索引擎优化&#xff08;SEO&#xff09;的…

UI自动化测试之Jenkins配置

团队下半年的目标之一是实现自动化测试&#xff0c;这里要吐槽一下&#xff0c;之前开发的测试平台了&#xff0c;最初的目的是用来做接口自动化测试和性能测试&#xff0c;但由于各种原因&#xff0c;接口自动化测试那部分功能整个废弃掉了&#xff0c;其中和易用性有很大关系…

chatgpt赋能python:Python安装教程:一步步实现Python开发环境搭建

Python安装教程&#xff1a;一步步实现Python开发环境搭建 Python是一种高效、易读、易维护的编程语言。在人工智能、数据科学、Web开发等领域都有广泛的应用。如果你是一名初学者或Python开发者&#xff0c;本文将为你提供Python安装教程。 第一步&#xff1a;下载Python安装…

深入浅出之Docker Compose详解

目录 1.Docker Compose概述 1.1 Docker Compose 定义 1.2 Docker Compose产生背景 1.3 Docker Compose 核心概念 1.4 Docker Compose 使用步骤 1.5 Docker Compose 常用命令 2. Docker Compose 实战 2.1 Docker Compose下载和卸载 2.2 Docker Compose 项目概述 2.3 Do…

chatgpt赋能python:Python定义局部变量的方法

Python定义局部变量的方法 Python是一种非常流行的编程语言&#xff0c;它被广泛用于各种应用程序开发、数据科学和机器学习任务。在Python中&#xff0c;如何定义局部变量是一个非常基本的概念。本文将重点介绍Python中定义局部变量的方法。 什么是局部变量&#xff1f; 在…

前端小项目基础版本----时刻监听audio音频的声音高低 可视化显示+源码

目录 时刻监听audio音频的声音高低第一代实现:基本第二代实现:完善 时刻监听audio音频的声音高低 前端小项目基础----时刻监听audio音频的声音高低 可视化显示 第一代实现:基本 实现的效果 根据 音频的某时刻高低 调整生成不同的柱状 以下就是 源码 直接复制粘贴 找个音频放…

AIGC技术研究与应用 ---- 下一代人工智能:新范式!新生产力!(2.3-大模型发展历程 之 图像、视频生成与视觉大模型)

文章大纲 GAN 模型与强化学习强化学习生成式对抗网络 ( Generative Adversarial Nets, GAN)VAE扩散模型扩散逆扩散参考文献与学习路径GPT 系列模型解析前序文章模型进化券商研报陆奇演讲强化学习生成模型多模态GAN 模型与强化学习 强化学习 Reinforcement learning (RL) is …

【SpinalHDL快速入门】4.5、复合类型之Bundle

文章目录 1.1、描述1.2、声明1.2.1、条件信号&#xff08;Conditional signals&#xff09; 1.3、运算符1.3.1、比较&#xff08;Comparison&#xff09;1.3.2、类型转换&#xff08;Type cast&#xff09;1.3.3、将比特转换回 Bundle 1.4、IO元素方向1.4.1、in/out1.4.2、mast…

《.NET 下最快比较两个文件内容是否相同》之我的看法验证

我对文件对比这一块还是比较感兴趣的&#xff0c;也想知道哪种方式性价比最高&#xff0c;效率最好&#xff0c;所以&#xff0c;根据这篇文章&#xff0c;我自己也自测一下&#xff0c;顺便留出自己对比的结果&#xff0c;供大佬们参考一二。 大致对比方案 我这边根据文章里…

循环队列(Ring Buffer)

背景&#xff1a; 最近在复习数据结构和算法&#xff0c;顺带刷刷题&#xff0c;虽然很长时间不刷题了但还是原来熟悉的味道&#xff0c;每一次重学都是加深了上一次的理解。本次我们看一下 循环队列(Ring Buffer)&#xff0c;C语言实现。 循环队列&#xff1a;首先 它是一个队…

chatgpt赋能python:Python安装好后怎么写代码?

Python安装好后怎么写代码&#xff1f; Python是一种高级编程语言&#xff0c;已成为众多开发者的首选工具。根据一些统计数据&#xff0c;Python排名全球第三的流行语言&#xff0c;已经成为Web开发、数据科学和人工智能领域的首选语言。如果您刚刚安装了Python&#xff0c;那…

【LeetCode全题库算法速练】6、N 字形变换

文章目录 一、题目&#x1f538;题目描述&#x1f538;样例1&#x1f538;样例2&#x1f538;样例3 二、代码参考 作者&#xff1a;KJ.JK &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &a…

YOLOv5/v7 添加注意力机制,30多种模块分析①,SE模块,SK模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、SE模块1、SE模块的原理2、代码实例3、实验结果4、应用示例&#xff08;1&#xff09;在 models/yolo.py 文件中定义 SEModule 类&#xff0c;用于实现SE模块。&#xff08;…

pyautogui实现自动连接GP VPN

支线小小项目(pyautogui实现自动连接GP VPN) 用了pyautogui做了一个懒人小脚本&#xff0c;主要是在家上班&#xff0c;每天要连公司vpn, 然后还要等好久&#xff0c;公司用的GP(global protect) VPN, 长这个样子 主要问题每次点击connect后需要等他先出来windows NT的login认…

Web安全总结

目录 网站架构一般web服务器结构相比于传统的网络攻击&#xff0c;基于web的攻击有什么不同&#xff1f;HTTP协议HTTP响应拆分攻击HTTPS针对HTTPS协议的攻击那么如何保证证书的唯一性&#xff1f; HTTP会话Cookie和Session的关系HTTP会话攻击解决方案 Web访问中的隐私问题Web应…

【读书笔记】《贫穷的本质》- [印度] Abhijit Banerjee / [法] Esther Duflo

文章目录 前言第一章 再好好想想第一部分 生活案例第二章 饥饿人口已达到10亿&#xff1f;第三章 提高全球居民健康水平容易吗&#xff1f;第四章 全班最优 前言 扶贫政策方面充斥着会取得立竿见影的效果的泡沫&#xff0c;事实证明这一点儿也不奇怪。要想取得进展&#xff0c;…

sed:命令讲解一

sed的使用&#xff1a; sed的使用 一、sed1.定义&#xff1a;2.工作流程&#xff1a;读取&#xff0c;执行&#xff0c;显示。3.基本操作格式&#xff1a;4.sed操作符&#xff1a;5.扩展&#xff1a; 一、sed 1.定义&#xff1a; 一种流编辑器&#xff0c;会在编辑器处理数据…

浅谈发改委强化电力需求侧管理缓解电力系统峰值压力方案设计 安科瑞 许敏

摘要&#xff1a;近年来全国用电负荷特别是居民用电负荷的快速增长&#xff0c;全国范围内夏季、冬季用电负荷“双峰”特征日益突出&#xff0c;恶劣气候现象多发增加了电力安全供应的压力。具有随机性、波动性、间歇性特征的可再生能源大规模接入电网对电力系统的稳定性带来新…

MySQL 索引及查询优化总结

一个简单的对比测试 前面的案例中&#xff0c;c2c_zwdb.t_file_count表只有一个自增id&#xff0c;FFileName字段未加索引的sql执行情况如下&#xff1a; 在上图中&#xff0c;typeall&#xff0c;keynull&#xff0c;rows33777。该sql未使用索引&#xff0c;是一个效率非常低…