回溯之子集问题

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

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. Ubuntu 16.04 更改系统语言为简体中文

    镜像下载.域名解析.时间同步请点击阿里巴巴开源镜像站 一.安装时报错 原因:以访客的身份进入的会报错,改为管理员进入即可. ps:有时候往往一点小细节也会造成大问题,但是我们要善于排错. 注:可以看到 ...

  2. 内网渗透----windows信息收集整理

    一.基础信息收集 1.信息收集类型 操作系统版本.内核.架构 是否在虚拟化环境中,已安装的程序.补丁 网络配置及连接 防火墙设置 用户信息.历史纪录(浏览器.登陆密码) 共享信息.敏感文件.缓存信息. ...

  3. 学习SpringMVC必知必会(2)~走近Spring MVC

    一.Spring 基本介绍 1.什么是 Spring MVC? SpringMVC 是 Spring-Frame 框架的子集(Spring-Frame包含了Spring MVC), MVC 框架,(类 ...

  4. DC-2

    环境搭建 下载地址: https://download.vulnhub.com/dc/DC-2.zip.torrent 从描述中得知有5个flag. 下载好后导入虚拟机 修改网络配置为NAT 探测靶机 ...

  5. APIO2015 八邻旁之桥/巴邻旁之桥

    题目描述: bz luogu 题解: 贪心+权值线段树. $K=1$的时候,答案为$\sum |x-l| + |x-r|$,所以所有端点排序后取中位数即可. $K=2$的时候,一定是左边的一些走左边的 ...

  6. Struts2的Action中获取request对象的几种方式?

    通过ActionContext.getSession获取 通过ServletActionContext.getRequest()获取 通过SessionAware接口注入 通过ServletReque ...

  7. Servlet的会话机制?

    因为http协议是无状态协议,又称为一次性连接,所以webapp必须有一种机制 能够记住用户的一系列操作,并且唯一标示一个用户. Cookie: 又称为小饼干,实际就是使用一个短文本保存用户信息, 在 ...

  8. 介绍Collection框架的结构?

    随意发挥题,天南海北谁便谈,只要让别觉得你知识渊博,理解透彻即可.

  9. DateUtils互转工具类

    public class DateUtils { /** * 取系统默认时区ID */ private static final ZoneId ZONE_ID; static { ZONE_ID = ...

  10. 使用IDEA开发SpringBoot不加载application.yml配置文件的解决方案

    1.如果启动项目不加载application.yml配置文件,那么请确认下是否应用了Resources为项目资源文件夹 2.如果项目起初是可以正常使用的,突然不知道改了什么,然后进行启动项目的时候不加 ...