Subsets II 求有重复元素的集合的子集 @LeetCode

求集合的所有子集问题 问题描述: 试写一个递归算法实现求一个集合的所有子集。 算法设计: 给定一个非空的集合,用递归算法输出它的所有子集。 数据输入: 由文件input.txt 提供输入数据。文件第1行是集合中的元素个数,第2行是集合的元素序列(元素之间用空格分隔)。 结果输出: 将计算出的所有子集分行输出到文件output.txt中。 输入文件示例: 3 1 2 3 输出文件示例: (此空行表示空集) 3 2 2 3 1 1 3 1 2 1 2 3 立即下载

与之前的Subsets题相比,改用HashSet来作为天然的过滤。


package Level4;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;

/**
 * Subsets II 
 * 
 *  Given a collection of integers that might contain duplicates, S, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If S = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]
 *
 */
public class S90 {

	public static void main(String[] args) {
		int[] num = {1,2,2};
		System.out.println(subsetsWithDup(num));
	}

	// 与之前相比改用HashSet来过滤
	public static ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {
		int len = num.length;
	    Set<ArrayList<Integer>> set = new HashSet<ArrayList<Integer>>();
	    Arrays.sort(num);
	    
	    // 利用2进制对应的bit来求所有subset,2进制中,0代表不选,1代表选择
	    for(int i=0; i<Math.pow(2,len); i++){
	        ArrayList<Integer> list = new ArrayList<Integer>();
	        int tmp = i;
	        // 对长为len的数,循环检查最右位是否为一
	        for(int j=0; j<len; j++){
	            int bit = tmp & 1;
	            tmp >>= 1;
	            if(bit == 1){
	                list.add(num[j]);
	            }
	        }
	        set.add(list);
	    }
	    return new ArrayList<ArrayList<Integer>>(set);
    }

}


这道题假如不用HashSet过滤,那么就不适合用2进制或者选或者不选的方法:

这里参考了另一种解法

public class Solution {
    public List<List<Integer>> subsetsWithDup(int[] num) {
        Arrays.sort(num);
        
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        List<Integer> list = new ArrayList<Integer>();
        rec(num, ret, list, 0);
        return ret;
    }
    
    
    public void rec(int[] num, List<List<Integer>> ret, List<Integer> list, int pos) {
        ret.add(new ArrayList<Integer>(list));
        
        for(int i=pos; i<num.length; i++) {
            if( i != pos && i-1 >= 0 && num[i] == num[i-1]) {
                continue;
            }   
            list.add(num[i]);
            rec(num, ret, list, i+1);
            list.remove(list.size()-1);
        }
    }
}



http://answer.ninechapter.com/solutions/subsets-ii/


【STM32】STM32F103C8T6多串口通信实战:3个USART并行收发与中断处理优化 本文详细介绍了STM32F103C8T6多串口通信的实战技巧,包括3个USART模块的并行配置、中断优先级优化及数据收发冲突规避策略。通过硬件初始化步骤、中断优先级设置和双缓冲区实现等方案,有效解决了多串口通信中的数据错乱问题,提升系统稳定性与效率。 阅读详情

相关推荐

【FPGA的基础快速入门23--------OV5640摄像头VGA显示】

FPGA的基础学习--------OV5640摄像头VGA显示OV5640简介二级目录三级目录 OV5640简介 OV5640同OV7725一样,都是Omni Vision(豪威科技)公司生产的CMOS图像传感器。 OV5640支持更高的分辨率(500W像素)、采集速率,具有更高的图像处理性能,主要应用在手机、数码相机、电脑多媒体等领域。 OV5640支持LED补光、MIPI(移动产业处理器接口)输出接口和DVP(数字视频并行)输出接口选择、ISP(图像信号处理)以及AFC (自动聚焦控制)等功能。 OV

暮雨中的坚果的博客 7690

【回溯法】重复元素集合 求子集

问题:给定一个可能具有重复数字的列表,返回其所有可能的子集。 样例 1: 输入:[0] 输出: [ [], [0] ] 样例 2: 输入:[1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 思路: 使用回溯法的递归框架; 解空间为子集树; 对于集合中出现了重复的数字,需要设计剪枝函数check(i)。规定重复元素的选取状态只能是前半部分1,后半部分0,从而排除重复项。例如【1,3,3,3】,对于重复元素3的选取,1

wang__Ray的博客 694

百度网盘开放平台OAuth 2.0授权全流程解析

本文详细解析了百度网盘开放平台OAuth 2.0授权全流程,包括创建应用、获取凭证、授权码模式详解以及access_token的使用与刷新。通过实际案例和代码示例,帮助开发者快速掌握接口调用技巧,避免常见错误,确保安全高效地接入百度网盘API。

wind6的博客 1266

回溯---含有相同元素求子集

含有相同元素求子集 90. Subsets II (Medium) For example, If nums = [1,2,2], a solution is: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 题目描述:   给定一个集合,集合中有重复元素,返回其所有的不重复子集。 思路分析:   求集合的子集,用回溯法进行解决。由于有重复...

weixin_30797027的博客 166

Vivado IP核综合失败别慌:除了打补丁,这个TCL命令也能救急(以Video Frame Buffer为例)

本文详细解析了Vivado IP核综合失败的排查方法,特别是针对Video Frame Buffer Read IP的常见问题。从补丁安装到深入分析DCP文件生成机制,再到使用强大的TCL命令`foreach ip_in_proj [get_ips] {compile_c [get_ips $ip_in_proj]}`强制重编译,提供了一套完整的解决方案。帮助开发者快速定位并解决IP核综合失败问题,确保项目顺利进行。

weixin_30892889的博客 424

一个三极管和稳压管构成的简易稳压电源

一、对电压精度要求不高的场所可以使用本文中所述的简易稳压电源(电流变化引起 的基极-发射极的压降 变化 对输出电压来说可以容忍)二、根据负载实际需求选择三极管,不同的三极管集电极电流不同,电流放大倍数不同(1、尽量选择负载电流(iC 或 iE)上限时,hFE仍然比较理想的三极管,2、一般三极管对基极电流没有限制,可以适当调整基极电流以获得所需输出电流)

五花带点肉 1万+

Leetcode 90:子集 II(最详细的解法!!!)

给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 解题思路 这个问题是之前问题Leetcode 78:子集(最详细的解法!!!)的扩展。我们用之前的解法会出现这样的问题,[1,2...

coordinate的博客 2457

别再手动画柜子了!用EPLAN导入STEP模型,5分钟搞定一个标准机柜

本文详细介绍了如何利用EPLAN Pro Panel的3D布局功能,快速将STEP模型转化为智能机柜宏,大幅提升电气工程设计效率。通过实战步骤解析,包括模型导入、智能解析、安装面定义及拼柜技巧,帮助工程师5分钟内完成标准机柜设计,避免传统手动建模的尺寸偏差问题。

weixin_26875109的博客 435

90.子集II- 力扣(LeetCode)

1.首次遇到元素(如 1 和第一个 2):将元素添加到 所有现有子集(res)中,生成新子集。例如:1 添加到空集生成 [1];第一个 2 添加到 [] 和 [1] 生成 [2] 和 [1,2]。2.遇到重复元素(如第二个 2):仅将元素添加到 上一轮生成的新子集(cur)中。例如:第二个 2 添加到上一轮的 [2] 和 [1,2],生成 [2,2] 和 [1,2,2],而不会重复生成 [2]。

2401_87004385的博客 548

基于cat12和SPM12进行VBM&SBM数据分析笔记1——数据预处理

基于cat12数据分析基础教程笔记 今年是小编步入研究生生活的第一年,研究方向待定,但主要以磁共振成像为主,以后会不断地总结这方面的知识,涉及MRI扫描,数据分析基础方法理论,软件操作教程,文献阅读笔记总结等等,用来记录我的研究生三年学习过程。编写尽量简洁明了,通俗易懂,本就是小白,也能体会小白的痛。不过这也要谢谢一个人手动@小白(网名),是他教我要把自己所学的写下来,讲出来才能真正的做到输入和输出,查漏补缺。而cat12软件操作是我面临的第一个数据分析的训练,写的可能也不会非常到位,还望各位专业人士指出改

Sophia2023的博客 4万+

SmartFusion从FPGA到ARM(一)——MSS_GPIO点灯

文章目录前言GPIO点灯 前言 GPIO点灯

whik1194的博客 5270

【算法】子集II

递归函数需要接收当前子集、当前遍历到的数组下标以及上一个被选中元素的下标作为参数。3、

时清云的博客 632

机器人动力学仿真软件:Webots_(14).机器人声音仿真

Webots 中的声音仿真主要通过Sound和两种节点来实现。Sound节点用于播放预定义的音频文件,而节点则允许在仿真过程中动态生成和播放声音。这些节点可以用于模拟机器人的语音输出、报警声、环境噪音等。以下是一个示例,展示如何在控制器代码中播放预定义的声音。// 控制器代码(.c) # include <webots/robot.h> # include <webots/sound.h> # define TIME_STEP 64 const char * sound_name = "sound";

kkchenjj的博客 1312

Subsets II @Leetcode

Subsets II  //Given a collection of integers that might contain duplicates, nums, return all possible subsets. //For example, If nums = [1,2,2], a solution is: [ /**   [2],   [1],   [1,2,2],  

Hanwenwangad的专栏 458

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

回溯算法13:子集 II

给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。

Ge_yangwen的博客 491

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

leetcode刷题——子集,子集 II

部分内容参考此文章 :LeetCode解题之Subsets 78.子集 题目:给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。 说明:解集不能包含重复的子集。 示例: 输入: nums = [1,2,3] 输出: [ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ] 解答 在网上查到了下面这个答案,作者思路很清晰,写的代...

哪惧明天,风高路斜 332

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

90. 子集 II

其实这道题目的知识点,我们之前都讲过了,如果之前讲过的子集问题和去重问题都掌握的好,这道题目应该分分钟AC。

YouMing_Li的博客 667

带重复元素的子集

给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 class Solution { public:

brucehb的专栏 815

18 - 带重复元素的子集

2017.9.14 写了一个新的函数 peekUnique(int[] nums,int k)。就是从一个数组中挑选k个数,有几种选择方案。 这样当求数组的子集的时候,就是k从1 到nums.length的peekUnique之和。 从n个数中选取k个数的公式为   f(n,k) = f(n-1,k)+f(n-1,k-1); public class Solution {

Missbubu的博客 374

LintCode笔记(11)—— 带重复元素的子集

给定一个可能具有重复数字的列表,返回其所有可能的子集  注意事项 子集中的每个元素都是非降序的两个子集间的顺序是无关紧要的解集中不能包含重复子集 您在真实的面试中是否遇到过这个题?  Yes 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,

lhanchao的博客 1713

有重复元素的集合求子集

已知一组数(其中有重复元素),求这组数可以组成的所有子集,结果中无重复的子集。 例如:nums[]=[2,1,2,2] 结果为:[[],[1],[1,2],[1,2,2],[1,2,2,2],[2],[2,2],[2,2,2]] 注意:[2,1,2]与[1,2,2]是重复的集合。 #include<vector> #include<algorithm> class Solu...

weixin_44208324的博客 678

lintcode 中等题:subsets II 带重复元素的子集

题目 带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 ...

weixin_34019929的博客 182

155.Subsets II (包含重复元素的数组的全部子集)

Given a collection of integers that might contain duplicates, nums, return all possible subsets. Note: The solution set must not contain duplicate subsets. For example, If nums = [1,2,2], a sol

记录点滴的专栏 1311

题目:带重复元素的子集

 给定一个可能具有重复数字的列表,返回其所有可能的子集 您在真实的面试中是否遇到过这个题? Yes 样例 如果S = [1,2,2],一个可能的答案为: [   [2],   [1],   [1,2,2],   [2,2],   [1,2],   [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是

881

lintcode---子集(带重复元素和不带重复元素的两种解法)

题目描述: 给定一个含不同整数的集合,返回其所有的子集。注意事项: 子集中的元素排列必须是非降序的,解集必须不包含重复的子集。样例: 如果 S = [1,2,3],有如下的解:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]思路分析(对于没有重复元素): 我们可以先看一个例子[1]、[1,

一直在路上的羊的博客 1262
上一篇: Search for a Range 有序数组里查找一个数的出现区间 @LeetCode
下一篇: Longest Palindromic Substring 在一个字符串里找最长回文子串@LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值