当前位置: 首页 > news >正文

Leetcoder Day25| 回溯part05:子集+排列

491.递增子序列

给定一个整型数组, 你的任务是找到所有该数组的递增子序列,递增子序列的长度至少是2。

示例:

  • 输入:[4, 7, 6, 7]
  • 输出: [[4, 6], [4, 7], [4, 6, 7], [6, 7], [7,7], [4,7,7]]

说明:

  • 给定数组的长度不会超过15。
  • 数组中的整数范围是 [-100,100]。
  • 给定数组中可能包含重复数字,相等的数字应该被视为递增的一种情况。

在子集中我们是通过排序,再加一个标记数组来达到去重的目的。而本题求自增子序列,是不能对原数组进行排序的,排完序的数组都是自增子序列了。所以不能使用之前的去重逻辑。本题抽象为树结构过程如下:

从上图可以看到,如果在同一个父节点下,同一树层使用过的元素便不再取,如果所取元素小于子序列最后一个元素,也不符合条件。因此,可以设置一个哈希集合,来记录当前所取的值是否被使用过,哈希集合在递归后不用回溯,因为记录的是同一树层的使用情况,新的循环会清空重新记录。

class Solution {List<List<Integer>> res =new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public void backTracking(int[] nums, int startIdx){if(path.size()>1){res.add(new ArrayList<>(path));}HashSet record= new HashSet<>();for(int i=startIdx;i<nums.length;i++){/*如果path不为空且当前元素小于path最后一个元素,则不取如果元素的值使用过,不取*/if((!path.isEmpty() &&  path.get(path.size()-1)>nums[i]) || record.contains(nums[i])){continue;}record.add(nums[i]);path.add(nums[i]);backTracking(nums, i+1);path.removeLast();}}public List<List<Integer>> findSubsequences(int[] nums) {backTracking(nums, 0);return res;}
}

46.全排列

给定一个 没有重复 数字的序列,返回其所有可能的全排列。

示例:

  • 输入: [1,2,3]
  • 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ]

排列问题不需要使用startIdx因为可以存在重复取值的情况,比如第一次1被取过,形成[1,2,3],后面还可以再取组成[2,1,3],但是需要设置一个数组used来记录当前元素在同一path中是否使用过。如果used[i-1]为true,则取下一个元素,因为本题为不重复的元素,所以不用去重。

class Solution {List<List<Integer>> res =new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();public void backTracking(int[] nums, boolean[] used){if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}for(int i=0;i<nums.length;i++){/* 如果used[i-1]为true,说明同一树枝上使用过值一样的元素如果used[i-1]为false,说明同一树层上使用过值一样的元素*/if(used[i]==true) continue;used[i]=true;path.add(nums[i]);backTracking(nums, used);path.removeLast();used[i]=false;}}public List<List<Integer>> permute(int[] nums) {boolean[] used=new boolean[nums.length];backTracking(nums, used);return res;}
}

📢注意:在调用回溯算法的时候,要记得创建一个used数组。

47.全排列 II

给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。

示例 1:

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

示例 2:

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

本题和上一题的区别在于有重复的数字,所以需要去重,先对数组进行排序,设置used数组记录是否使用过如果used[i-1]为true,说明同一树枝上使用过值一样的元素;如果used[i-1]为false,说明同一树层上使用过值一样的元素。

import java.util.Arrays;
class Solution {List<List<Integer>> res =new ArrayList<>();LinkedList<Integer> path = new LinkedList<>();boolean[] used;public void backTracking(int[] nums, boolean[] used){if(path.size()==nums.length){res.add(new ArrayList<>(path));return;}for(int i=0;i<nums.length;i++){/*当 used[i-1]== used[i]时used[i-1]为true,说明同一树枝使用过若为false,说明同一树层使用过*/if(used[i]==true || (i>0 && nums[i-1]==nums[i] && used[i-1]==false)){continue;}used[i]=true;path.add(nums[i]);backTracking(nums, used);path.removeLast();used[i]=false;}}public List<List<Integer>> permuteUnique(int[] nums) {Arrays.sort(nums);used=new boolean[nums.length];backTracking(nums, used);return res;}
}

相关文章:

  • 大概了解一下G1收集器
  • Redis 学习笔记 3:黑马点评
  • 服务器部署java 的docker项目,以及常用的一些命令
  • 可视化图文报表
  • Python爬虫进阶:爬取在线电视剧信息与高级检索
  • 【论文阅读】基于图像处理和卷积神经网络的板式换热器气泡识别与跟踪
  • iOS高级理论:分类和扩展
  • 多微服务合并为一个服务
  • 如何在debian上实现一键恢复操作系统?
  • 在IDEA中创建vue hello-world项目
  • Chapter 10 Basic Magnetics Theory
  • 微服务-实用篇
  • 机器视觉运动控制一体机在光伏汇流焊机器人系统的解决方案
  • Shell echo、printf、test命令
  • 中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • angular学习第一篇-----环境搭建
  • avalon2.2的VM生成过程
  • Effective Java 笔记(一)
  • el-input获取焦点 input输入框为空时高亮 el-input值非法时
  • HTTP中GET与POST的区别 99%的错误认识
  • learning koa2.x
  • ng6--错误信息小结(持续更新)
  • SOFAMosn配置模型
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • vue:响应原理
  • 从tcpdump抓包看TCP/IP协议
  • 面试总结JavaScript篇
  • 前端_面试
  • 设计模式走一遍---观察者模式
  • FaaS 的简单实践
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • #pragma multi_compile #pragma shader_feature
  • #每日一题合集#牛客JZ23-JZ33
  • $(function(){})与(function($){....})(jQuery)的区别
  • (poj1.2.1)1970(筛选法模拟)
  • (层次遍历)104. 二叉树的最大深度
  • (二)JAVA使用POI操作excel
  • (附源码)计算机毕业设计SSM智慧停车系统
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)关于pipe()的详细解析
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .bat批处理(六):替换字符串中匹配的子串
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .net6 webapi log4net完整配置使用流程
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • ::before和::after 常见的用法
  • @EnableAsync和@Async开始异步任务支持
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @WebServiceClient注解,wsdlLocation 可配置
  • [ CTF ]【天格】战队WriteUp- 2022年第三届“网鼎杯”网络安全大赛(青龙组)
  • [20171106]配置客户端连接注意.txt
  • [2018][note]用于超快偏振开关和动态光束分裂的all-optical有源THz超表——