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

算法刷刷刷| 回溯篇| 子集问题大集合

78.子集

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

import java.util.ArrayList;
import java.util.List;class Solution {private List<Integer> path = new ArrayList<>();private List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {backTrace(nums, 0);return res;}private void backTrace(int[] nums, int start) {res.add(new ArrayList<>(path));if (start >= nums.length) {return;}for (int i = start; i < nums.length; i++) {path.add(nums[i]);backTrace(nums, i + 1);path.remove(path.size() - 1);}}
}

90.子集II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。
示例 1:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;class Solution {private List<Integer> path = new ArrayList<>();private List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);backTrace(nums, 0);return res;}private void backTrace(int[] nums, int start) {res.add(new ArrayList<>(path));if (start == nums.length) {return;}for (int i = start; i < nums.length; i++) {if (i > start && nums[i] == nums[i - 1]) {continue;}path.add(nums[i]);backTrace(nums, i + 1);path.remove(path.size() - 1);}}
}

去重需要先对数组进行排序,可别忘记了!!!
这里要求有重复元素的集合,同一个树层上的元素不能重复,同一个树枝(上下)上可以取重复

491.递增子序列

给你一个整数数组 nums ,找出并返回所有该数组中不同的递增子序列,递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。
数组中可能含有重复元素,如出现两个整数相等,也可以视作递增序列的一种特殊情况。
示例 1:
输入: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]]
示例 2:
输入:nums = [4,4,3,2,1]
输出:[[4,4]]

class Solution {public List<List<Integer>> findSubsequences(int[] nums) {backTracing(nums, 0);return res;}private List<Integer> path = new ArrayList<>();private List<List<Integer>> res = new ArrayList<>();private void backTracing(int[] nums, int start) {if (path.size() > 1) {res.add(new ArrayList<>(path));}if (start == nums.length) {return;}Map<Integer, Integer> map = new TreeMap<>();for (int i = start; i < nums.length; i++) {if ((path.size() > 0 && nums[i] < path.get(path.size() - 1)) || map.containsKey(nums[i])) {continue;}map.put(nums[i], 0);path.add(nums[i]);backTracing(nums, i + 1);path.remove(path.size() - 1);}}
}

注意这道题不可以进行排序,子集问题又需要去重,以前的排列之后判断是不是和前一个相同的逻辑不适用了,这里每层用一个map记录数组中的元素是不是出现过,出现过的不再使用,并且要保证递增序列,在每个元素放进path的时候和path中的最后一个元素比较,小就不再进行递归了,这一枝截断!

http://www.lryc.cn/news/9430.html

相关文章:

  • 合并两个有序数组-力扣88-java
  • 2022「大厂可观测」重磅回顾,12场直播,15位技术大咖洞见可观测
  • CMMI-配置管理(CM)
  • 网络编程套接字Socket
  • Linux进程概念(二)
  • 墨天轮【第二届数据库掌门人论坛】圆满收官 | 含嘉宾精彩观点回顾
  • Redis之集群搭建
  • 31-Golang中的二维数组
  • <<Java开发环境配置>>6-SQLyog安装教程
  • MySQL 中的 distinct 和 group by 哪个效率更高
  • 计算机相关专业毕业论文选题推荐
  • 网络编程套接字之TCP
  • 网络与串口调试工具TCPCOM
  • 数据库常用命令
  • PTA复习
  • TypeScript 学习之接口
  • 原码反码补码
  • 大数据选股智能推荐系统V1.0-1
  • 调研生成GIF表情包之路
  • 【RocketMQ】源码详解:生产者启动与消息发送流程
  • 信息安全(一)
  • 企业多会场视频直播(主会场、分会场直播)实例效果
  • 线性代数速览(一)行列式
  • 恭喜山东翰林“智慧园区管理系统”获易知微可视化设计大赛二等奖
  • gulp简单使用
  • ce认证机构如何选择?
  • 全网招募P图高手!阿里巴巴持续训练鉴假AI
  • webrtc QOS笔记一 Neteq直方图算法浅读
  • 细分和切入点
  • iOS创建Universal Link