java数据结构与算法刷题-----LeetCode46. 全排列

news2025/1/18 9:02:08
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 暴力回溯
    • 2. 分区法+回溯

在这里插入图片描述

1. 暴力回溯

解题思路:时间复杂度O( n n n^n nn),但是严格来说只到了O( n ∗ n ! n*n! nn!) 因为很多元素只进行了一个判断,没有执行其它操作,所以它们不会很耗费时间,如果把判断算上,则是n^n时间复杂度。空间复杂度O(n)
  1. 创建一个flag数组,boolean类型。标志当前数字是否被选过。
  2. 我们每个位置的数字枚举时,都先检查flag数组,如果当前数字为false,则可选。
  3. 直到所有数字枚举完成
代码

在这里插入图片描述

class Solution {
    int[] nums;
    boolean[] numsFlag;//flag数组,true表示当前这个值已经选过
    int len;
    List<List<Integer>> ans = new ArrayList<List<Integer>>();
    public List<List<Integer>> permute(int[] nums) {
        this.nums = nums;this.len = nums.length;
        this.numsFlag = new boolean[len];
        ArrayList<Integer> records = new ArrayList<>();
        backTracking(records);
        return ans;
    }
    //回溯算法
    public void backTracking(List<Integer> records){
        if(records.size() == len) ans.add(new ArrayList<>(records));//全排列完成后,保存答案
        else{
            for(int i = 0;i<len;i++){//每个位置都可以选任何值,但是如果当前数字已被选过,则必须跳过这个值
                if(this.numsFlag[i]==false){//如果这个值没有被选
                    this.numsFlag[i] = true;//标志为被选过
                    records.add(nums[i]);//选择这个数字
                    backTracking(records);//进行下一个数字的枚举
                    this.numsFlag[i] = false;//枚举完成后,放弃这个值
                    records.remove(records.size()-1);//尝试当前位置下一个可能的值
                }
            }
        }
    }
}

2. 分区法+回溯

解题思路:时间复杂度O( n ∗ n ! n*n! nn!),空间复杂度O(n)
  1. 将数组分为两个区域,用index下标分割,index左边保存当前已经选择的数字,右边保存剩余可选的数字
  2. 每次通过交换操作,将我们想要在这次选择的数字,移动到index位置,然后index++
  3. 下个数字只能从index和index后面的位置选取。这样就自动跳过了已经选取过的数字。而不用flag数组进行额外的判断
代码

在这里插入图片描述

class Solution {

	List<List<Integer>> ans = new ArrayList<>();
    int[] nums;
    public List<List<Integer>> permute(int[] nums) {
        this.nums = nums;
        backTracking( 0);
        return ans;
    }

    /**
     * 回溯算法
     * @param index 表示当前可选值的下标
     * 将数组人为分成两部分[ 已选数字 | 剩余可选数字 ],就是通过index下标来区分,index左边是已选数字,右边是可选数字
     * 我们通过交换操作,每次将选中的数字放到左边,那么剩余的可选数字都会在右边
     * 这样每次选择数字时,已经选过的就直接跳过了,不需要再用一个boolean类型数组来标志哪些数字没有被选过
     */
    public void backTracking(int index){
        if (index == nums.length) {//全排列,一定是所有元素都参与排列组合
            List<Integer> list = new ArrayList<>();
            for( int num : nums ) list.add(num);
            ans.add(list);
        }else {
            //j表示当前位置的可选值,是前面选剩下的元素
            for (int j = index; j < nums.length; j++) {//j表示当前位置选哪个值,一定是所有可选的都要枚举一遍
                //选中j元素,则将j元素放入已选区域
                swap(nums, index, j);
                //放入一个j元素进入已选区域后,index指针后移,进行下一个位置的选取
                backTracking(index + 1);
                //枚举不选择当前j元素的情况,则将j放回原位。然后尝试下一个可选值。
                swap(nums, j, index);//
            }
        }
    }
    private void swap(int[] nums, int i, int j){
        if (i == j) return;
        nums[i] = nums[i] ^ nums[j];
        nums[j] = nums[i] ^ nums[j];
        nums[i] = nums[i] ^ nums[j];
    }

}

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

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

相关文章

精酿啤酒:煮沸、发酵与成熟的过程解析

在啤酒酿造过程中&#xff0c;煮沸、发酵与成熟是重要的环节&#xff0c;它们对啤酒的口感、香气和品质具有决定性的影响。下面将详细解析Fendi Club啤酒在煮沸、发酵与成熟过程中的关键步骤和与众不同之处。 煮沸是啤酒酿造过程中的一个重要环节。在这一步骤中&#xff0c;麦汁…

mfc140u.dll丢失的解决方法,解决mfc140u.dll问题,让程序运行畅通无阻

如果你的电脑丢失了mfc140u.dll文件&#xff0c;那么可能是电脑中的mfc140u.dll文件发成了变化&#xff0c;倒是点找不到mfc140u.dll文件&#xff0c;并运行mfc140u.dll&#xff0c;那么有什么办法可以解mfc140u.dll丢失的问题呢&#xff1f;接了下来就带大脚先了解一下mfc140u…

linux_aarch64_qt环境搭建

平台环境&#xff1a; ubuntu 16.04&#xff1a; gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.12) aarch64 gnu gcc版本&#xff1a; gcc-linaro-5.4.1-2017.05-x86_64_aarch64-linux-gnu.tar.xz Qt交叉编译版本: qt-everywhere-src-5.12.9.tar.xz 一、aarch64编…

Yolo系列算法-理论部分-YOLOv5

0. 写在前面 YOLO系列博客&#xff0c;紧接上一篇Yolo系列算法-理论部分-YOLOv4-CSDN博客 1. YOLOv5-美而全的产品 YOLOv5的诞生&#xff0c;直接将目标检测算法向终局推进&#xff0c;Ultralytics团队在COCO数据集上预训练的目标检测架构和模型直接开源&#xff0c;其中包含了…

springboot同时接收json数据和 MultipartFile

首先测试接口发送方式。。。。。注意发送结构&#xff01; 后端接收RequestPart SaCheckPermission("system:records:add")Log(title "【用药纪录】", businessType BusinessType.INSERT)RepeatSubmit()PostMapping()public R<Void> add( RequestP…

【上海大学计算机组成原理实验报告】一、数据传送实验

一、实验目的 了解实验仪器数据总线的控制方式。掌握数据传送的基本原理。掌握各寄存器的结构、工作原理及其控制方法。 二、实验原理 根据实验指导书的相关内容&#xff0c;数据输入到寄存器的过程是先通过指令选择源和目标&#xff0c;再通过数据总线来传送数据&#xff0…

mac电脑解决无法打开软件

文章目录 报错内容解决方法一方法二方法三 报错内容 macOS无法验证此App是否包含恶意软件。 解决方法一 打开系统偏好设置>安全性与隐私>通用&#xff0c;这个时候有个按钮&#xff0c;“仍然允许”点击即可。 方法二 按住Control键点按应用, 然后打开&#xff0c…

D1084 5A低压差电压调整器芯片——具有5A输出能力、低压差为1.5V的三端稳压器

1、 概述&#xff1a; D1084是一款具有5A输出能力、低压差为1.5V的三端稳压器。输出电压可通过电位器调节或1.5V, 1.8V, 3.3V三个固定电压版。内含电流限制和热保护功能&#xff0c;防止任何过载时产生过高的结温。D1084系列电路有标准TO-220、TO-263和TO-252封装形式。 2、 典…

AIX7.2下安装qt4.8.7

在AIX安装Qt需要编译安装&#xff0c;编译需要安装xlC编译器。 安装好xlC编译器后我们需要将对应的路径导入到PATH环境变量中 export PATH/opt/IBM/xlC/16.1.0/bin:/opt/IBM/xlc/16.1.0/bin:$PATH 解压 qt-everywhere-opensource-src-4.8.7.tar.gz gunzip -d qt-everywhere…

pr怎么导出mp4格式?正确步骤在这里

在PR中导出MP4格式的视频文件是一项基本而重要的技能&#xff0c;特别是当您希望与他人分享您的创作或在不同平台上展示您的作品时。正确的导出步骤不仅确保视频质量的最大化&#xff0c;还可以确保文件格式的兼容性&#xff0c;使得您的视频能够在各种设备和平台上无缝播放。p…

markdown笔记公式(持续更新)

文章目录 1. 如何插入数学公式2. 加减乘除3. 幂数、指数、对数4. 根号、省略号、向量以及特殊符号&#xff08;大于等于、小于等于&#xff09;、划线5. 累加、累乘6. 矩阵6.1无框矩阵6.2 边框矩阵6.3 带省略符号的矩阵6.4 带分割符号的矩阵6.5 行中矩阵 7. 积分8. 极限运算9. …

【3GPP】【核心网】【5G】5G核心网组网方案(超详细)

5G NR RRC协议总体介绍 1. 开机入网流程 UE入网过程包括几个子过程: 小区搜索与选择 UE开机选网,小区搜索并完成下行同步。 系统消息广播 UE读取广播信息,选择合适小区进行驻留。 随机接入 UE与gNB建立上行同步。 RRC连接建立 …

HTML案例-1.标签练习

效果 源码 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head&g…

链路聚合实验(华为)

思科设备参考&#xff1a;链路聚合实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 网络设备的链路聚合技术&#xff08;Link Aggregation&#xff09;是一种将多个物理链路捆绑在一起&#xff0c;形成一个逻辑链路的技术。这样做可以增加带宽、提高可靠性和实现负…

硬件笔记(26)---- 高速电路中滤波电容的选取

先要知道电容的等效电路 其中ESL取决于电容的类型和封装&#xff0c;一般用贴片陶瓷电容为例&#xff0c;对于直插式电解电容&#xff0c;他们的ESL很大。按下表&#xff0c;封装越大&#xff0c;ESL越大&#xff0c;但是0612有些例外 0612和1206就是 长短边的区别&#xff0c;…

【征稿中-EI稳定检索】2024年电力、能源工程和计算机技术国际学术会议 (ICPEECT 2024)

【征稿中-EI稳定检索】2024年电力、能源工程和计算机技术国际学术会议 (ICPEECT 2024) 2024 International Conference on Power, Energy Engineering, and Computer Technology (ICPEECT 2024) 会议官网&#xff1a;http://www.icpeect.com &#xff08;先投稿&#xff0c;先…

【联邦学习贡献评估-数据评估指标的介绍】

跨机构联邦学习 企业或机构作为参与方的联邦学习称为跨机构联邦学习, 也称为企业对企业联邦 学习(business-to-business, B2B FL). 跨机构联邦学习呈现参与方数量少、算力充足、单个参与方数据 量大、存在商业风险顾虑等特点. 案例 典型案例是 FATE 联邦学习平台, 为金融等行…

OJ_这是一颗树吗

题干 C实现 树结构需要满足的三个条件 不存在入度大于2的结点已连通的u&#xff0c;v&#xff0c;再加入一条新边就会成环边数 顶点数-1 #include <iostream> #include <vector> using namespace std;//并查集的应用&#xff1a;判断图的连通性int set[10001];…

最迟但到的 Star History 2023 年度开源精选!

千呼万唤始出来&#xff0c;Star History 2023 年终开源精选来啦&#xff01;&#x1f389; AI 是 2023 开源领域里最主要的关键词&#xff0c;但其实过去一年还是有很多其他值得关注的项目和发展趋势的&#xff01;Star History 小编总结了几个类别并精选了类别中最亮眼的项目…

Java基于微信小程序的校园订餐小程序的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…