回溯之子集问题

  • 子集问题和组合问题特别像

Leetcode78-子集

  • 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)
  • 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集
  • 输入:nums = [1,2,3]
  • 输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
 List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsets(int[] nums) {
dfs(nums, 0);
return res;
} private void dfs(int[] nums, int begin) {
res.add(new ArrayList<>(path));
for (int i=begin; i<nums.length; i++) {
path.add(nums[i]);
dfs(nums, i+1);
path.remove(path.size()-1);
}
}

Leetcode90-子集二

  • 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)
  • 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列
  • 输入:nums = [1,2,2]
  • 输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
  • 总结:一般有重复元素 如果简单的话都是排序然后判断nums[i]==nums[i-1];复杂的话用hashset(见下一题)
    List<List<Integer>> res = new ArrayList<>();
List<Integer> path = new ArrayList<>();
public List<List<Integer>> subsetsWithDup(int[] nums) {
Arrays.sort(nums);
dfs(nums, 0);
return res;
}
private void dfs(int[] nums, int begin) {
res.add(new ArrayList<>(path));
for (int i=begin; i<nums.length; i++) {
if(i>0 && i!=begin && nums[i]==nums[i-1]){
continue;
}
path.add(nums[i]);
dfs(nums, i+1);
path.remove(path.size()-1);
}
}

Leetcode491-递增子序列

  • 给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案
  • 数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况
  • 输入:nums = [4,6,7,7]
  • 输出:[[4,6],[4,6,7],[4,6,7,7],[4,7],[4,7,7],[6,7],[6,7,7],[7,7]]
public class L491 {
LinkedList<List<Integer>> res=new LinkedList<>();
LinkedList<Integer> integers=new LinkedList<>();
Set<Integer> set = new HashSet<Integer>();
public List<List<Integer>> findSubsequences(int[] nums) {
find(nums,0);
return res;
} // public void find(int[] nums,int startIndex){
// if(integers.size()>1){
// if(!res.contains(integers)){//去重
// res.add(new ArrayList<>(integers));
// }
// }
// for(int i=startIndex;i<nums.length;i++){
// if(!integers.isEmpty() && nums[i]<integers.getLast()){
// continue;
// }
// integers.add(nums[i]);
// find(nums,i+1);
// integers.removeLast();
// }
// } public void find(int[] nums,int startIndex){
if(integers.size()>1){
res.add(new ArrayList<>(integers));
}
Set set=new HashSet<Integer>();//注意在这里new 这样每次深度递归时都是新的set
for(int i=startIndex;i<nums.length;i++){
if(!integers.isEmpty() && nums[i]<integers.getLast() || set.contains(nums[i])){
continue;
}
set.add(nums[i]);
integers.add(nums[i]);
find(nums,i+1);
integers.removeLast();
}
} public static void main(String[] args) {
int[] test=new int[]{4,6,7,7,7};
L491 l491 = new L491();
List<List<Integer>> subsequences = l491.findSubsequences(test);
for (List<Integer> subsequence : subsequences) {
for (Integer integer : subsequence) {
System.out.print(integer);
}
System.out.println();
}
}
}

Leetcode78/90/491之回溯中的子集问题的更多相关文章

  1. 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

    [源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 ...

  2. 第90节:Java中的Linux基础

    第90节:Java中的Linux基础 linux是装载虚拟机上面的: JDK依赖包: yum install glibc.i686 MYSQL依赖包: yum -y install libaio.so ...

  3. 回溯法、子集树、排列树、满m叉树

    显示图: 明确给出了图中的各顶点及边 隐式图: 仅给出初始节点.目标节点及产生子节点的条件(一般有问题提议隐含给出)的情况下,构造一个图. 回溯法: 从初始状态出发,在隐式图中以深度优先的方式搜索问题 ...

  4. javascript父级鼠标移入移出事件中的子集影响父级的处理方法

    一.我们先分析其产生的原因: 1.当鼠标从父级移入子集时触发了父级的两个事件:a.父级的mouseout事件(父级离开到子集):b.由于事件冒泡影响,又触发了父级的mouseover事件(父级移入父级 ...

  5. Python: 从字典中提取子集--字典推导

    问题: 构造一个字典,它是另外一个字典的子集 answer: 最简单的方式是使用字典推导 eg1: 1. >>>prices = {'ACME': 45.23, 'AAPL': 61 ...

  6. 【leetcode题目整理】数组中找子集

    368. Largest Divisible Subset 题意:找到所有元素都不同的数组中满足以下规则的最大子集,规则为:子集中的任意两个元素a和b,满足a%b=0或者b%a=0. 解答:利用动态规 ...

  7. 【python cookbook】【数据结构与算法】17.从字典中提取子集

    问题:想创建一个字典,其本身是另一个字典的子集 解决方案:利用字典推导式(dictionary comprehension)可轻松解决 # example of extracting a subset ...

  8. 第90天:HTML5中文件API和拖放操作

    一.文件API File API:提供客户端本地操作文件的可能 multiple是让文件域可以多选 <!DOCTYPE html> <html lang="en" ...

  9. java中list或数组中随机子集工具类

    package com.example.demo.test; import java.util.ArrayList;import java.util.Arrays;import java.util.L ...

随机推荐

  1. Source Code Reading for Vue 3: How does `hasChanged` work?

    Hey, guys! The next generation of Vue has released already. There are not only the brand new composi ...

  2. Failed to execute "C:\learn\C\程序练习\1.exe": Error 0: 操作成功完成。 请按任意键继续. . .问题解决

    在DEV中编译运行时出现以上提示,原因是该文件被杀毒软件隔离了,认为它是病毒文件 解决办法,找到该文件进行恢复

  3. MySQL知识补充(表字段操作、视图、触发器、事物、存储过程、内置函数、流程控制、索引、慢查询)

    今日内容概要 表字段操作补充(掌握) 视图(了解) 触发器(了解) 事务(掌握) 存储过程(了解) 内置函数(了解) 流程控制(了解) 索引(熟悉) 内容详细 1.表字段操作补充 # 1.添加表字段 ...

  4. 用C语言读写数据

    //1-5题 #include "stdio.h" typedef struct { char name[10];//姓名 int subject1,subject2,subjec ...

  5. Oracle的数据优化(经常被问到)?

    以Oracle数据库举例:(a-G要求掌握,H一般为DBA操作,了解就可以了) a. 建库:已知将保存海量数据的时候,因为Oracle是通过用户来管理数据的, 第一步我们先建一个tableaspace ...

  6. spring cloud 和dubbo区别?

    1.服务调用方式 dubbo是RPC springcloud Rest Api2.注册中心,dubbo 是zookeeper springcloud是eureka,也可以是zookeeper3.服务网 ...

  7. 运行 Spring Boot 有哪几种方式?

    打包用命令或者放到容器中运行用 Maven/ Gradle 插件运行直接执行 main 方法运行

  8. Nacos如果加载不到配置文件的Debug

    进入  com.alibaba.cloud.nacos.client.NacosPropertySourceLocator#loadApplicationConfiguration  这个方法 com ...

  9. ZAB 和 Paxos 算法的联系与区别?

    相同点: 1.两者都存在一个类似于 Leader 进程的角色,由其负责协调多个 Follower 进程的运行 2.Leader 进程都会等待超过半数的 Follower 做出正确的反馈后,才会将一个提 ...

  10. idea使用maven工程创建web项目并支持jsp

    主要要再pom文件里面添加依赖: <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api --> & ...