Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
Home
  • 计算机网络
  • 操作系统
  • 数据结构与算法
  • 设计模式
  • JavaSE
  • JVM
  • JUC
  • Netty
  • CPP
  • QT
  • UE
  • Go
  • Gin
  • Gorm
  • HTML
  • CSS
  • JavaScript
  • vue2
  • TypeScript
  • vue3
  • react
  • Spring
  • SpringMVC
  • Mybatis
  • SpringBoot
  • SpringSecurity
  • SpringCloud
  • Mysql
  • Redis
  • 消息中间件
  • RPC
  • 分布式锁
  • 分布式事务
  • 个人博客
  • 弹幕视频平台
  • API网关
  • 售票系统
  • 消息推送平台
  • SaaS短链接系统
  • Linux
  • Docker
  • Git
GitHub (opens new window)
  • 哈希表

  • 双指针

  • 数组

  • 字符串

  • 链表

  • 树

  • 回溯

    • 组合类型
    • 子集类型
      • 78. 子集
      • 90. 子集 II
      • 491. 递增子序列
    • 排列类型
    • 树回溯
    • 经典题
    • 遍历dfs
  • 动态规划

  • 图

  • 二分查找

  • 贪心

  • 栈&队列

  • 堆

  • 位运算

  • 数据结构设计

  • rui的精选题单

  • 笔试真题

  • LeetCode周赛

  • ACM模式输入输出
  • 数学

  • 数据结构与算法
  • 回溯
Nreal
2023-11-19
目录

子集类型

# 78. 子集 (opens new window)

方法一:选哪个?

class Solution {
    List<List<Integer>> ret = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    int[] nums;
    public List<List<Integer>> subsets(int[] nums) {
        this.nums = nums;
        dfs(0);
        return ret;
    }
    void dfs(int i){
        ret.add(new ArrayList<>(path));
        if(i==nums.length){
            return ;
        }
        for(int j=i;j<nums.length;j++){
            path.add(nums[j]);
            dfs(j+1);
            path.remove(path.size()-1);
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

方法二:选或不选

class Solution {
    List<List<Integer>> ret = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    int[] nums;
    public List<List<Integer>> subsets(int[] nums) {
        this.nums = nums;
        dfs(0);
        return ret;
    }
    void dfs(int i){
        if(i==nums.length){
            ret.add(new ArrayList<>(path));
            return ;
        }
        // 选
        path.add(nums[i]);
        dfs(i+1);
        path.remove(path.size()-1);
        dfs(i+1);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

# 90. 子集 II (opens new window)

class Solution {
    List<List<Integer>> ret = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    int[] nums;
    boolean[] vis;
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        this.nums = nums;
        this.vis = new boolean[nums.length];
        Arrays.sort(nums);
        dfs(0);
        return ret;
    }
    void dfs(int i){
        ret.add(new ArrayList<>(path));
        if(i==nums.length){
            return ;
        }
        for(int j=i;j<nums.length;j++){
            // !vis[j-1] 是因为 先执行dfs,出栈时已经置为false,第二个2就不执行了
            if(j>0 && nums[j]==nums[j-1] && !vis[j-1]){
                continue;
            }
            path.add(nums[j]);
            vis[j] = true;
            dfs(j+1);
            path.remove(path.size()-1);
            vis[j] = false;
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 491. 递增子序列 (opens new window)

组合类型
排列类型

← 组合类型 排列类型→

Theme by Vdoing | Copyright © 2021-2024
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式