【算法刷题 | 回溯思想 06】4.17(子集、子集||)

news/2024/10/21 10:00:01/

在这里插入图片描述

文章目录

9.子集

9.1题目

给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。

解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。

  • 示例一:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
  • 示例二:
输入:nums = [0]
输出:[[],[0]]

9.2解法:回溯

9.2.1回溯思路

image-20240417125635959

(1)函数返回值以及参数
private void backing(int startIndex,int[] nums)
(2)终止条件
  • 每次递归遍历都要把当前子集加进res中

  • 当startIndex大于数组长度,则结束递归

res.add(new ArrayList(paths));
if(startIndex>=nums.length-1){return;
}
(3)遍历过程
for(int i=startIndex;i<nums.length;i++){paths.add(nums[i]);backing(i+1,nums);//回溯paths.remove(nums.length-1);
}

9.2.2代码实现

	List<List<Integer>> res=new ArrayList<>();List<Integer> paths=new ArrayList<>();public List<List<Integer>> subsets(int[] nums) {backing(0,nums);return res;}private void backing(int startIndex,int[] nums){res.add(new ArrayList(paths));if(startIndex>nums.length-1){return;}for(int i=startIndex;i<nums.length;i++){paths.add(nums[i]);backing(i+1,nums);//回溯  paths.remove(paths.size()-1);}}

10.子集 ||

10.1题目

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的 子集(幂集)。

解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

  • 示例一:
输入:nums = [1,2,2]
输出:[[],[1],[1,2],[1,2,2],[2],[2,2]]
  • 示例二:
输入:nums = [0]
输出:[[],[0]]

10.2解法:回溯

10.2.1回溯思路

  • 先将数组排序,这样重复元素肯定相邻
  • 同一树层,不可以使用同一元素;同一树枝,可以使用同一元素;
  • isUsed[i]:为true,则代表同一树枝用到了元素nums[i],isUsed[i+1]还可以用

image-20240417135008494

10.2.2代码实现

	List<List<Integer>> res=new ArrayList<>();List<Integer> paths=new ArrayList<>();boolean[] isUsed;public List<List<Integer>> subsetsWithDup(int[] nums) {Arrays.sort(nums);isUsed=new boolean[nums.length];Arrays.fill(isUsed,false);backing(0,nums);return res;}private void backing(int startIndex,int[] nums){res.add(new ArrayList(paths));if(startIndex>nums.length-1){return;}for(int i=startIndex;i<nums.length;i++){if(i!=0 && nums[i]==nums[i-1] && isUsed[i-1]==false){//该元素在同一树层已经用过了continue;}{paths.add(nums[i]);isUsed[i]=true;backing(i+1,nums);//回溯  paths.remove(paths.size()-1);isUsed[i]=false;}}}

在这里插入图片描述


http://www.ppmy.cn/news/1426834.html

相关文章

R:UpSet韦恩图制作

#安装UpSetR install.packages("UpSetR") library(UpSetR) #install.packages("UpSetR") library(UpSetR) library(Cairo) # 从CSV文件中读取数据 setwd("C:/Users/fordata/Desktop/研究生/第二个想法(16s肠型&#xff0b;宏基因组功能)/第二篇病毒组…

Jenkins 的构建时执行时间问题

我们希望我的项目能够在特定的时间自动执行&#xff0c;我们需要设定一个定时任务。 Jenkins 的定时任务是通过 Cron 任务来实现的&#xff0c;但是由有点不一样。 H/2 * * * * 比如说上面的设置就是每 2 分钟执行一次。 希望每分钟执行一次 Jenkins 的每分钟执行一次的设置…

算法训练营第43天|LeetCode 1049.最后一块石头的重量Ⅱ 494.目标和 474.一和零

LeetCode 1049.最后一块石头的重量Ⅱ 题目链接&#xff1a; LeetCode 1049.最后一块石头的重量Ⅱ 代码&#xff1a; class Solution { public:int lastStoneWeightII(vector<int>& stones) {int sum 0;int size stones.size();for(int i0;i<size;i){sum st…

Apache Doris 2.1.2 版本正式发布!

亲爱的社区小伙伴们&#xff0c;Apache Doris 2.1.2 版本已于 2024 年 4 月 12 日正式发布。该版本提交了若干改进项以及问题修复&#xff0c;进一步提升了系统的性能及稳定性&#xff0c;欢迎大家下载体验。 官网下载页&#xff1a;https://doris.apache.org/download/ GitH…

机器学习实验------决策树

第1关&#xff1a;什么是决策树 任务描述 本关任务&#xff1a;根据本节课所学知识完成本关所设置的选择题。 第2关&#xff1a;信息熵与信息增益 任务描述 本关任务&#xff1a;掌握什么是信息增益&#xff0c;完成计算信息增益的程序设计。 import numpy as npdef calcIn…

Rust入门-Hello World

1、安装 在 Linux 或 macOS 上安装 rustup 打开终端并输入下面命令&#xff1a; $ curl --proto https --tlsv1.2 https://sh.rustup.rs -sSf | sh如果安装成功&#xff0c;将出现下面这行&#xff1a; Rust is installed now. Great!2、更新 $ rustup self uninstall3、卸…

视频怎么去水印,轻松去视频水印的方法

视频水印是为了提高视频的版权保护能力&#xff0c;防止视频被盗用或者不正当使用&#xff0c;但另一方面会破坏视频的流畅度和清晰度&#xff0c;很影响视觉观感和后续创作。想要去除视频水印&#xff0c;下面三种方法你必须得知道&#xff0c;赶紧看过来~ 1、使用美图秀秀(A…

5G网络开通与调测ipv4

要求如下&#xff1a; 1. 勘站规划 1. 【重】首先观察NR频点&#xff0c;完成设备选型 2645--选择N41 3455--选择N78 4725--选择N79 设备选型如下&#xff1a;观察AAU的通道数&#xff0c;最大发射功率&#xff1b;选择N41的选型频段也要选41 2. …