剑指Offer题目笔记24(集合的组合、排序)

面试题79:

面试题79

问题:

​ 输入一个不含重复数字的数据集合,找出它的所有子集。

解决方案:

​ 使用回溯法。子集就是从一个集合中选出若干元素。如果集合中包含n个元素,那么生成子集可以分为n步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到子集中或不将该数字添加到子集中。生成一个子集可以分为若干步,并且每一步都面临若干选择。

源代码:
class Solution {
    public List<List<Integer>> subsets(int[] nums) {
        List<List<Integer>> result = new ArrayList<>();
        helper(nums,0,new LinkedList<>(),result);
        return result;
    }
	
    private void helper(int[] nums,int index,LinkedList<Integer> list,List<List<Integer>> result){
        //扫描完数组后,将链表List<Integer>添加到链表List<List<Integer>>
        if(index == nums.length){
            result.add(new LinkedList<>(list));
        }else{
            //情况一:不添加该数字
            helper(nums,index + 1,list,result);
			
            //情况二:添加该数字
            list.add(nums[index]);
            helper(nums,index + 1,list,result);
            //删除链表中最后一个元素
            list.removeLast();
        }
    }
}

面试题80:

面试题80

问题:

​ 输入n和k,输出从1到n中选取k个数字组成的所有组合。

解决方案:

​ 使用回溯法。从1到n的集合中选出若干元素。如果组合只能有k个元素,那么生成组合可以分为k步,每一步从集合中取出一个数字,此时面临两个选择,将该数字添加到组合中或不将该数字添加到组合中。生成一个组合可以分为若干步,并且每一步都面临若干选择。

源代码:
class Solution {
    public List<List<Integer>> combine(int n, int k) {
        List<List<Integer>> result = new LinkedList<>();
        dfs(n,1,k,new LinkedList<>(),result);
        return result;
    }
	//num用于标记当前数字
    private void dfs(int n,int num,int k,LinkedList<Integer> list,List<List<Integer>> result){
        //扫描完数组后,将链表List<Integer>添加到链表List<List<Integer>>
        if(list.size() == k){
            result.add(new LinkedList<>(list));
        }else if(num <= n){
            //情况一:不添加该数字
            dfs(n,num+1,k,list,result);
			//情况二:添加该数字
            list.add(num);
            dfs(n,num+1,k,list,result);
            //删除链表中最后一个元素
            list.removeLast();
        }
    }
}

面试题81:

面试题81

问题:

​ 给定一个没有重复数字的正整数集合,找出所有元素之和等于某个给定值的所有组合。同一个数字可以在组合中出现任意次。

解决方案:

​ 使用回溯法。将问题分为若干步来解决,每一步的面临若干选择。每一步从集合中取出下标为i的数字,此时面临两个选择,一个选择是跳过该数字,不将该数字添加到组合中,另一个选择就是将数字添加到组合中,由于一个数字可以在组合中重复出现,所以下一步仍然处理下标为i的数字,

源代码:
class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new LinkedList<>();
        dfs(candidates,target,0,new LinkedList<>(),result);
        return result;
    }
	
    private void dfs(int[] candidates,int target,int i,LinkedList<Integer> list,List<List<Integer>> result){
        if(target == 0){
            result.add(new LinkedList<>(list));
        }else if(target > 0 && i < candidates.length){
			//情况一:跳过该数字
            dfs(candidates,target,i+1,list,result);
			//情况二:添加该数字
            list.add(candidates[i]);
            dfs(candidates,target-candidates[i],i,list,result);
            list.removeLast();
        }
    }
}

面试题82:

面试题82

问题:

​ 给定一个可能包含重复数字的整数集合,请找出所有元素之和等于某个给定值的所有组合。

解决方案:

​ 使用回溯法。该题与前几题类似,但是组合可以有重复数字,但是组合不能相同,避免重复的组合的方法是当在某一步决定跳过某个值为m的数字时,跳过所有值为m的数字。为了方便跳过后面所有值相同的数字,先将集合中的所有数字排序,再进行跳跃。

源代码:
class Solution {
    public List<List<Integer>> combinationSum2(int[] candidates, int target) {
        //排序数组
        Arrays.sort(candidates);

        List<List<Integer>> result = new LinkedList<>();
        dfs(candidates,target,0,new LinkedList<>(),result);
        return result;
    }

    private void dfs(int[] candidates,int target,int i,LinkedList<Integer> list,List<List<Integer>> result){
        if(target == 0){
            result.add(new LinkedList<>(list));
        }else if(target > 0 && i < candidates.length){
            dfs(candidates,target,getNext(candidates,i),list,result);

            list.addLast(candidates[i]);
            dfs(candidates,target-candidates[i],i+1,list,result);
            list.removeLast();
        }
    }
	//跳过数组中值等于num的下标
    private int getNext(int[] candidates,int num){
        int next = num;
        while(next < candidates.length && candidates[num] == candidates[next]){
            next++;
        }

        return next;
    }
}

面试题83:

面试题83

问题:

​ 给定一个没有重复数字的集合,找出它的所有全排序。

解决方案;

​ 使用回溯法。如果输入的集合中有n个元素,那么生成一个全排列需要n步。当生成排列的第1个数字时会面临n个选项,即n个数字都有可能成为排列的第1个数字。生成排列的第1个数字之后接下来生成第2个数字,此时面临n-1个选项,即剩下的n-1个数字都有可能成为第2个数字。然后以此类推,直到生成最后一个数字,此时只剩下1个数字,也就只有1个选项。

源代码:
class Solution {
    public List<List<Integer>> permute(int[] nums) {
        List<List<Integer>> result = new LinkedList<>();
        dfs(nums,0,result);
        return result;
    }

    private void dfs(int[] nums,int i,List<List<Integer>> result){
        //如果i等于nums.length,说明数组nums已经按顺序排序完成。
        if(i == nums.length){
            LinkedList<Integer> list = new LinkedList<>();
            for(int num:nums){
                list.add(num);
            }
            result.add(new LinkedList<>(list));
        }else{
            //排序每一个数,如数组中的所有元素都可以成为下标0的位置,包括它自己
            for(int j = i;j < nums.length;j++){
               
                swap(nums,i,j);
                dfs(nums,i+1,result);
                swap(nums,i,j);
            }
        }
    }
 	//交换两数字在数组的位置
    private void swap(int[] nums,int i,int j){
        if(i != j){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
}

面试题84:

面试题84

问题:

​ 给定一个包含重复数字的集合,找出它的所有全排列。

解决方案:

​ 使用回溯法。与上一题类似,但是添加了包含重复数字的条件,在上一题的基础上使用Set集合排序重复数字。

源代码:
class Solution {
    public List<List<Integer>> permuteUnique(int[] nums) {
        List<List<Integer>> result = new LinkedList<>();
        dfs(nums,0,result);
        return result;
    }

    private void dfs(int[] nums,int i,List<List<Integer>> result){
        //如果i等于nums.length,说明数组nums已经按顺序排序完成。
        if(i == nums.length){
            LinkedList<Integer> list = new LinkedList<>();
            for(int num:nums){
                list.add(num);
            }
            result.add(new LinkedList<>(list));
        }else{
            //使用Set集合排除重复数字
            Set<Integer> set = new HashSet<>();
            for(int j = i;j < nums.length;j++){
                if(!set.contains(nums[j])){
                    set.add(nums[j]);

                    swap(nums,i,j);
                    dfs(nums,i+1,result);
                    swap(nums,i,j);
                }
            }
        }
    }

    private void swap(int[] nums,int i,int j){
        if(i != j){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据可视化:智慧农业发展的催化剂

数据可视化在智慧农业中发挥着不可替代的作用。随着科技的不断进步&#xff0c;农业领域也在不断探索创新&#xff0c;以提高生产效率、优化资源利用&#xff0c;从而实现可持续发展。而数据可视化技术的应用&#xff0c;则成为了实现智慧农业目标的重要途径。下面我就从可视化…

ABAP OOALV标题设置

ABAP OOALV标题设置 OOALV默认标题是SAP&#xff0c;需要我们自己创建GUI 标题 创建GUI 标题&#xff0c;写好要展示的描述 添加截图中的代码即可。 下面的ALV 报表标题修改的位置在以下代码区域。 这时候通过查询layout&#xff08;wa_layout TYPE lvc_s_layo&#xff0…

mini2440移植lvgl(v8.2)

目录 概述 1 下载源码 1.1 登录LVGL git地址 1.2 LVGL linux平台上的库文件介绍 1.3 下载代码 1.3.1 下载lvgl 1.3.2 下载lv_drivers 1.3.3 下载lv_port_linux_frame_buffer 2 配置编译环境 2.1 创建工程目录 2.2 完善工程目录下的文件 2.2.1 构建工程文件 2.2.2 匹…

Oracle常用sql命令(新手)

1、备份单张表 创建复制表结构 create table employeesbak as select * from cims.employees 如果只复制表结构&#xff0c;只需要在结尾加上 where 10 插入数据 insert into employeesbak select * from cims.employees 删除一条数据 delete from…

水泥设备如何实现物联网远程监控?

水泥设备如何实现物联网远程监控&#xff1f; 在当今的工业4.0时代&#xff0c;水泥行业正在经历一场深度的技术革新&#xff0c;其中构建智慧工厂并采用物联网远程监控解决方案成为了提升生产效率、保障产品质量、实现节能减排的关键路径。该方案通过集成先进的信息技术、物联…

list使用与模拟实现

目录 list使用 reverse sort unique splice list模拟实现 类与成员函数声明 节点类型的定义 非const迭代器的实现 list成员函数 构造函数 尾插 头插 头删 尾删 任意位置插入 任意位置删除 清空数据 析构函数 拷贝构造函数 赋值重载函数 const迭代器的设计 …

【PostgreSQL】用pgAdmin轻松管理PostgreSQL

pgAdmin 是一个功能强大的开源Web界面工具&#xff0c;专为管理和维护PostgreSQL数据库而设计。它提供了一个直观的图形界面&#xff0c;使得用户能够轻松地执行复杂的数据库操作&#xff0c;如查询、更新、导入/导出数据以及管理数据库对象等。pgAdmin 支持几乎所有的PostgreS…

EasyExcel 模板导出excel、合并单元格及单元格样式设置。 Freemarker导出word 合并单元格

xls文件&#xff1a; 后端代码&#xff1a; InputStream filePath this.getClass().getClassLoader().getResourceAsStream(templateFile);// 根据模板文件生成目标文件ExcelWriter excelWriter EasyExcel.write(orgInfo.getFilename()).excelType(ExcelTypeEnum.XLS).withTe…

redis 数据库的安装及使用方法

目录 一 关系数据库与非关系型数据库 &#xff08;一&#xff09;关系型数据库 1&#xff0c;关系型数据库是什么 2&#xff0c;主流的关系型数据库有哪些 3&#xff0c;关系型数据库注意事项 &#xff08;二&#xff09;非关系型数据库 1&#xff0c;非关系型数据库是…

37.HarmonyOS鸿蒙系统 App(ArkUI) 创建第一个应用程序hello world

HarmonyOS App(ArkUI) 创建第一个应用程序helloworld 线性布局 1.鸿蒙应用程序开发app_hap开发环境搭建 3.DevEco Studio安装鸿蒙手机app本地模拟器 打开DevEco Studio,点击文件-》新建 双击打开index.ets 复制如下代码&#xff1a; import FaultLogger from ohos.faultL…

鸿蒙OS元服务开发说明:【WebGL网页图形库开发接口】

一、场景介绍 WebGL主要帮助开发者在前端开发中完成图形图像的相关处理&#xff0c;比如绘制彩色图形等。目前该功能仅支持使用兼容JS的类Web开发范式开发。 二、接口说明 表1 WebGL主要接口列表 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更…

elment UI el-date-picker 月份组件选定后提交后台页面显示正常,提交后台字段变成时区格式

需求&#xff1a;要实现一个日期的月份选择<el-date-picker :typeformData.dateType :value-formatdateFormat v-modelformData.leaveFactoryDateplaceholder选择月份></el-date-picker>错误示例&#xff1a;将日期显示类型(type)dateType或将日期绑定值的格式(val…

Java SpringBoot中优雅地判断一个对象是否为空

在Java中&#xff0c;可以使用以下方法优雅地判断一个对象是否为空&#xff1a; 使用Objects.isNull()方法判断对象是否为空&#xff1a; import java.util.Objects;if (Objects.isNull(obj)) {// obj为空的处理逻辑 }使用Optional类优雅地处理可能为空的对象&#xff1a; impo…

为何网易游戏会选择引入OceanBase数据库

本文作者&#xff1a;田维繁&#xff0c;网易游戏关系型数据库小组负责人 作为中国游戏开发领域的佼佼者&#xff0c;网易游戏始终站在网络游戏自主研发的前沿。其产品及周边产品线丰富多样&#xff0c;因此&#xff0c;为满足各种业务场景的需求&#xff0c;需要多种不同的数据…

XRDP登录ubuntu桌面闪退问题

修改 /etc/xrdp/startwm.sh unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR . $HOME/.profile

ensp华为AC+AP上线配置

AR1配置&#xff1a; <Huawei>system-view # 进入系统视图<Huawei>sysname R1 # 设备重命名[R1]dhcp enable # 开启DHCP功能[R1]interface GigabitEthernet0/0/0 # 进入接口 [R1-GigabitEthernet0/0/0]ip address 192.168.0.1 23 # 配置接口地址 [R1-GigabitE…

教育信创 | 云轴科技ZStack联合飞腾发布全场景教育信创白皮书

随着数字化时代的到来&#xff0c;教育行业正面临着前所未有的挑战与机遇。为了推动教育行业的数字化转型和信创人才培养&#xff0c;云轴科技ZStack联合飞腾于3月28日正式发布了《教育行业数字化自主创新飞腾生态解决方案白皮书》&#xff08;简称《教育白皮书》&#xff09;。…

Flutter应用混淆技术原理与实践

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

Nginx三大常用功能“反向代理,负载均衡,动静分离”

注意&#xff1a;以下案例在Windows系统计算机作为宿主机&#xff0c;Linux CentOS 作为虚拟机的环境中实现 一&#xff0c;Nginx配置实例-反向代理 1.反向代理 案例一 实现效果&#xff1a;使用nginx反向代理&#xff0c;访问 www.123.com 直接跳转到127.0.0.1:8080 准备工…

HBase(超级无敌详细PROMAX讲解版)

简介 概述 图-1 HBase图标 HBase原本是由Yahoo!公司开发的后来贡献给了Apache的一套开源的、基于Hadoop的、分布式的、可扩展的非关系型数据库(Non-Relational Database)&#xff0c;因此HBase不支持SQL(非关系型数据库基本上都不支持SQL)&#xff0c;而是提供了一套单独的命…