代码随想录算法训练营day28

news2025/2/27 14:20:41

题目:78_子集(没看题解)

给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。

说明:解集不能包含重复的子集。

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

#

算法思想:

子集问题,树上的结点都是目标集合,不需要剪枝。但要注意仍然是组合问题,集合是无序的,每次从 indexstart 开始。

代码:

import java.util.ArrayList;
import java.util.List;

class Solution {
    List<Integer> list = new ArrayList<>();
    List<List<Integer>> ans = new ArrayList<>();

    void backtracking(List nums, int startindex) {
        if (startindex >= nums.size()) {    //无需剪枝
            return;
        }
        for (int i = startindex; i < nums.size(); i++) {
            list.add((Integer) nums.get(i));
            ans.add(new ArrayList<>(list));
            backtracking(nums, i + 1);
            list.remove(list.size() - 1);
        }

    }

    public List<List<Integer>> subsets(int[] nums) {
        ArrayList<Integer> list = new ArrayList<>();
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
        }
        backtracking(list, 0);
        ans.add(new ArrayList<>());
        return ans;

    }
}

题目:90_子集2

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

说明:解集不能包含重复的子集。

示例:

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

#

算法思想:

数组中包含重复元素,层间要去重。

去重思想,把数组变为递增有序数组,那么重复元素都在相邻位置。设置used数组,在枝上当前元素前一个重复元素 used 为true,在同一层当前元素的前一个相同元素由于回溯 used 为false。

则当满足  i > 0 && list.get(i - 1) == list.get(i) && used[i - 1] == false;  

跳过,防止重复

代码:

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

//解法1:先把所有集合回溯法求出来,最后再去重。
//但是有部分用例通过不了
//class Solution {
//    List<Integer> list = new ArrayList<>();
//    List<List<Integer>> ans = new ArrayList<>();
//
//    boolean isContain(List<Integer> list, List<List<Integer>> ans){
//        for (int i = 0; i < ans.size(); i++) {
//            //先对两个集合中元素进行排序,这样就能保证元素值相同equals比较结果就为true
//
//            if(ans.get(i).equals(list))
//                return false;
//        }
//        return true;
//    }
//
//    void backtracking(List nums, int startindex) {
//        if (startindex >= nums.size()) {
//            return;
//        }
//        for (int i = startindex; i < nums.size(); i++) {
//            list.add((Integer) nums.get(i));
//            if(isContain(list,ans)) {
//                ans.add(new ArrayList<>(list));
//            }
//            backtracking(nums, i + 1);
//            list.remove(list.size() - 1);
//        }
//
//    }
//
//    public List<List<Integer>> subsetsWithDup(int[] nums) {
//        ArrayList<Integer> list = new ArrayList<>();
//        for (int i = 0; i < nums.length; i++) {
//            list.add(nums[i]);
//        }
//        backtracking(list, 0);
//        ans.add(new ArrayList<>());
//        return ans;
//
//    }
//}


//回溯的过程中减枝
class Solution {
    List<Integer> path = new ArrayList<>();
    List<List<Integer>> ans = new ArrayList<>();
    boolean[] used = new boolean[11];

    void backtracking(List list, int startindex) {
        if (startindex >= list.size()) {
            return;
        }
        for (int i = startindex; i < list.size(); i++) { // 组合问题无序,每次从startindex开始
            if (i > 0 && list.get(i - 1) == list.get(i) && used[i - 1] == false) { // 去除同层重复元素
                continue;
            }
            path.add((Integer) list.get(i));
            used[i] = true;
            ans.add(new ArrayList<>(path));
            // 递归
            backtracking(list, i + 1);
            // 回溯
            path.remove(path.size() - 1);
            used[i] = false;

        }

    }

    public List<List<Integer>> subsetsWithDup(int[] nums) {
        Arrays.sort(nums); // 给数组排序
        List<Integer> list = new ArrayList<>();
        // 手动把 nums[] 转 ArrayList
        for (int i = 0; i < nums.length; i++) {
            list.add(nums[i]);
        }
        backtracking(list, 0);
        ans.add(new ArrayList<>()); // 加入空集合
        return ans;

    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1473467.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…

Mavenn编译报processing instruction can not have PITarget with reserveld xml name

在java项目中&#xff0c;平时我们会执行mvn clean package命令来编译我们的java项目&#xff0c;可是博主今天执行编译时突然报了 processing instruction can not have PITarget with reserveld xml name 这个错&#xff0c;网上也说法不一&#xff0c;但是绝大绝大部分是因…

C++:类与对象(2)

创作不易&#xff0c;感谢三连&#xff01; 一、六大默认成员函数 C为了弥补C语言的不足&#xff0c;设置了6个默认成员函数 二、构造函数 2.1 概念 在我们学习数据结构的时候&#xff0c;我们总是要在使用一个对象前进行初始化&#xff0c;这似乎已经成为了一件无法改变的…

YOLOv9中的“ADown”结构!

ADown结构出炉啦&#xff0c;收藏起来写论文用&#xff01; 论文链接&#xff1a; YOLOv9: Learning What You Want to Learn Using Programmable Gradient 代码链接&#xff1a;https://github.com/WongKinYiu/yolov9/tree/main 1.代码&#xff1a; 代码路径&#xff1a;yol…

gitlab添加ssh公钥

一&#xff1a;生成公钥 桌面鼠标右击打开 Open Git Bash here (前提是安装了Git)&#xff1b; 2.输入命令 ssh-keygen -t rsa -C "123*****90qq.com"来生成新的密钥对,将其中的"123*****90qq.com"替换为你自己的电子邮件地址。 命令&#xff1a;ssh-keyg…

BUUCTF crypto做题记录(10)新手向

一、[MRCTF2020]古典密码知多少 这题一看首先能想到猪圈密码&#xff0c;每种颜色都代表一种古典密码。鉴于都是用图形表示&#xff0c;其余两种与猪圈密码类似。BUUCTF-Crypto-猪圈密码及其变种银河密码跳舞的小人_猪圈密码对照表-CSDN博客 在这篇文章中介绍一些与猪圈密码类…

windows 11+docker desktop+grafana+influxDB+python写入

下载安装docker desktop 出现WSL相关的错误。WSL是一个linux内核的子系统&#xff0c;docker是基于linux内核的&#xff0c;所以运行docker需要WSL。 以管理员权限打开powershell&#xff0c;查看WSL状态 wsl --status 我遇到的错误是因为我关闭了windows的某些更新 执行上…

dhtmlxGannt显示的时间比end_date少一天

在配置项中增加gantt.config.server_utc true&#xff0c;设置允许在向服务器发送数据时将服务器端日期从UTC转换为本地时区&#xff1b;

nginx---------------重写功能 防盗链 代理 (五)

一、重写功能 rewrite Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求&#xff0c;此功能依靠 PCRE(perl compatible regular expression)&#xff0c;因此编译之前要安装PCRE库&#xff0c;rewrite是nginx服务器的重要功能之一&#xff0c;重写功能(…

postgressql和postgis安装

PostgreSQL安装 1 简 介 2 PostgreSQL优点特性 3 安装PostgreSQL 3.1 Yum安装 3.2 RPM包安装 3.3 源码安装 4 安装PostGIS 4.1 安装依赖 4.2 检查PostGIS是否安装成功 5 PostgreSQL多实例 PostgreSQL安装 1 简 介 PostgreSQL 是一种非常复杂的对象-关系型数…

华为手动ipv6-to-ipv4隧道

中间r2的两个接口配置两个地址就行了&#xff0c;其它什么都不用配置 两边出接口R1和R3手动隧道建立&#xff1a;先把IPV4打通&#xff0c;并配置默认路由 再起隧道接口上进行配置&#xff0c;再配置带隧道的默认路由 PC上和上联接口网关只有IPV6地址 最终两个PC可以ping通 …

基于Java SSM框架实现音乐播放器管理系统项目【项目源码+论文说明】

基于java的SSM框架实现音乐播放器管理系统演示 摘要 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减…

【element+vue】点击加号增加一行,点击减号删除一行

代码实现&#xff1a; 页面部分&#xff1a; vueelement 备注&#xff1a;v-if “i>0” &#xff08;保证第一行不出现减号&#xff09; <div v-for"(item,i) in studentList"><el-form-item label"学生:" prop"name"><el-i…

电动车进电梯监测报警摄像机助力提升安全管理

电动车作为环保、便捷的出行工具&#xff0c;在城市中越来越受到人们的青睐。然而&#xff0c;在电梯内使用电动车存在一定的安全隐患&#xff0c;为了有效管理电动车进出电梯的安全&#xff0c;一款电梯监测报警摄像机应运而生&#xff0c;为出行安全提供了更为全面的保障。 这…

StarRocks之监控管理(内含DashBoard模板)

先看下最终效果图 架构 Prometheus 是一个拥有多维度数据模型的、灵活的查询语句的时序数据库。它可以通过 Pull 或 Push 采集被监控系统的监控项,存入自身的时序数据库中。并且通过丰富的多维数据查询语言,满足用户的不同需求。 Grafana 是一个开源的 Metric 分析及可视化系…

C#使用Bogus生成测试数据

Bogus介绍 Bogus 是一个流行的 C# 库&#xff0c;用于生成伪造数据。它提供了简单而强大的 API&#xff0c;可以帮助开发人员轻松生成各种类型的随机数据&#xff0c;包括姓名、地址、日期、电子邮件、电话号码等。Bogus 设计灵活&#xff0c;使其适用于各种测试场景&#xff…

10分钟快速开始SkyWalking结合Springboot项目

10分钟快速开始SkyWalking结合Springboot项目 实习期间&#xff0c;公司让我去学习一下链路追踪如何集成到Springboot项目中。 为此有两个方案&#xff1a; 1.opentelementryjaegerprometheus opentelementry 收集器收集线上的metrics和traces&#xff0c;然后发送给jaeger和p…

Acwing周赛记录

很难得参加一次周赛hhhhh这次参加的是第144场周赛&#xff0c;一共有三道题 AcWing 5473. 简单数对推理 给定两个整数数对&#xff0c;每个数对都包含两个 1∼9 之间的不同整数。 这两个数对恰好包含一个公共数&#xff0c;即恰好有一个整数同时包含于这两个数对。 给定这两…

Python算法100例-2.7 爱因斯坦的数学题

完整源代码项目地址&#xff0c;关注博主私信源代码后可获取 1.问题描述2.问题分析3.算法设计4.确定程序框架5.完整的程序6.运行结果 1&#xff0e;问题描述 爱因斯坦出了一道这样的数学题&#xff1a;有一条长阶梯&#xff0c;若每步跨2阶&#xff0c;则最后剩一阶&#xf…

国产服务器操作系统

为何记录 最近的开发工作经常接触到国产服务器操作系统的业务&#xff0c;经常被x86、arm、龙芯、鲲鹏、欧拉...搞得一脸懵逼&#xff0c;遂记之&#xff01; 操作系统 这里按照应用场景分&#xff1a; 桌面操作系统&#xff1a;主要用于pc&#xff0c;如Windows、macOS、Li…