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

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.mzph.cn/news/745956.shtml

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

相关文章

Linux下JSON解析工具

jq&#xff1a;是一个强大的命令行工具&#xff0c;用于处理 JSON 格式的数据。它可以帮助你查询、过滤、修改和处理 JSON 数据&#xff0c;使得再命令行环境下处理 JSON 变得非常方便。 官方下载地址&#xff1a; https://jqlang.github.io/jq/download/ 官方文档&#xff1…

Python和MATLAB数字信号波形和模型模拟

要点 Python和MATLAB实现以下波形和模型模拟 以给定采样率模拟正弦信号&#xff0c;生成给定参数的方波信号&#xff0c;生成给定参数隔离矩形脉冲&#xff0c;生成并绘制线性调频信号。快速傅里叶变换结果释义&#xff1a;复数离散傅里叶变换、频率仓和快速傅里叶变换移位&am…

【软考高项】六、信息技术发展之计算机网络知识点

1、网络作用划分 个人局域网(PAN)、局域网(LAN)、城域网(MAN)、广域网(WAN)、公用网、专用网。 2、OSI七层 物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 3、广域网协议类型 PPP点对点协议、ISDN综合业务数字网、xDSL(DSL数字用户线路的统称:HDSL.SDSL、M…

Python中Pandas常用函数及案例详解

Pandas是一个强大的Python数据分析工具库&#xff0c;它为Python提供了快速、灵活且表达能力强的数据结构&#xff0c;旨在使“关系”或“标签”数据的操作既简单又直观。Pandas的核心数据结构是DataFrame&#xff0c;它是一个二维标签化数据结构&#xff0c;可以看作是一个表格…

04- 基于SpringAMQP封装RabbitMQ,消息队列的Work模型和发布订阅模型

SpringAMQP 概述 使用RabbitMQ原生API在代码中设置连接MQ的参数比较繁琐,我们更希望把连接参数写在yml文件中来简化开发 SpringAMQP是基于AMQP协议定义的一套API规范,将RabbitMQ封装成一套模板用来发送和接收消息 AMQP(Advanced Message Queuing Portocol)是用于在应用程序…

[CISCN2019 华东南赛区]Web11

模块注入题&#xff0c;这类题一般拥有固定的payload。 界面大概就是这么个样子 返回了IP地址&#xff0c;提示getip&#xff0c;xff等。 这是smarty模板。很明显了&#xff0c;这个模板存在xff处的命令执行。抓取数据包并添加字段 X-Forwarded-For:{{system(ls)}} cat /fla…

【Spring Boot 3】【Camel 4】动态路由

【Spring Boot 3】【Camel 4】动态路由 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花费…

密码学——MAC

消息认证码 在信息发送和接收过程中,若攻击者能够得到信息,进行篡改,就能达到欺骗,诈骗,冒名顶替的作用。为了防止冒名诈骗,一个对策就是使用消息认证码——MAC: Message Authentication Code。 消息认证码,即确定消息真实性的认证程序。发件人将想要发送的信息和从哪个…

LeetCode18.四数之和

LeetCode19 四数之和 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&am…

【视觉三维重建】【论文笔记】Deblurring 3D Gaussian Splatting

去模糊的3D高斯泼溅&#xff0c;看Demo比3D高斯更加精细&#xff0c;对场景物体细节的还原度更高&#xff0c;[官网]&#xff08;https://benhenryl.github.io/Deblurring-3D-Gaussian-Splatting/&#xff09; 背景技术 Volumetric rendering-based nerual fields&#xff1a…

linux sshd_config配置说明

[root01 ssh]# cat sshd_config #######################SSH Base Config################## #######通过OpenSSH工具入xshell连接默认端口 可以改成其他默认是22 PAM 认证过程 1&#xff09;使用者执行/usr/bin/passwd程序&#xff0c;并输入密码。 2&#xff09;passwd开…

有效的正方形(LeetCode 593)

文章目录 1.问题描述2.难度等级3.热门指数4.解题思路边长验证法等腰直角三角形验证法正方形定义 参考文献 1.问题描述 给定 2D 空间中四个点的坐标 p1, p2, p3 和 p4&#xff0c;如果这四个点构成一个正方形&#xff0c;则返回 true 。 点的坐标 pi 表示为 [xi, yi] 。 输入没…

【开源-土拨鼠充电系统】鸿蒙 HarmonyOS 4.0+微信小程序+云平台

本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-system ✍Gitee开源项目地址&#x1f449;&#xff1a;https://gitee.com/cheinlu/groundhog-charging-system ✨踩坑不易&am…

192基于matlab的雷达信号进行RD图的仿真

基于matlab的雷达信号进行RD图的仿真&#xff0c;在距离进行匹配滤波&#xff0c;具体方法是与回波信号的FFT与参考信号对称共轭的FFT相乘&#xff0c;再IFFT。在多普勒维通过多普勒滤波器组进行滤波&#xff0c;相当于进行FFT。程序已调通&#xff0c;可直接运行。 192 matlab…

牛客小白月赛60-C-小竹关禁闭

很经典的dp问题 对于求解动态规划类的问题,关键就是阶段,状态,决策,状态转移方程 本题的核心点就是,怎么找到上一个状态 dp[i] max(dp[i -1],dp[i - k - 1] a[i]) 当前点不选,它的上一个状态就是i - 1 当前点如果选,它的上一个状态是i - k - 1 关键就是它对应的上一个状…

Elasticsearch:使用标记修剪提高文本扩展性能

作者&#xff1a;来自 Elastic Kathleen DeRusso 本博客讨论了 ELSER 性能的令人兴奋的新增强功能&#xff0c;该增强功能即将在 Elasticsearch 的下一版本中推出&#xff01; 标记&#xff08;token&#xff09;修剪背后的策略 我们已经详细讨论了 Elasticsearch 中的词汇和…

C#十大排序总结

一、冒泡排序 传送门 一、C#冒泡排序算法-CSDN博客 未完待续。。。

CS架构和BS架构

在软件开发领域&#xff0c;CS架构和BS架构是两种常见的架构模式&#xff0c;用于描述客户端和服务器之间的交互方式。这两种架构模式分别代表Client/Server架构和Browser/Server架构。 CS架构&#xff08;Client/Server架构&#xff09;&#xff1a; 客户端&#xff08;Client…

测试用例执行计划(100%用例) C卷(JavaPythonC++Node.jsC语言)

某个产品当前迭代周期内有N个特性({F1,F2,., })需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其ID作为下标进行标识。 设计了M个测试用例({T1,T2.……,Tm}),每个用例对应了一个覆盖特性的集合,测试用例使用其ID作为下标进行标识,测试用例的优先级定义为其覆盖…

KY211 特殊排序

描述&#xff1a; 输入一系列整数&#xff0c;将其中最大的数挑出(如果有多个&#xff0c;则挑出一个即可)&#xff0c;并将剩下的数进行排序&#xff0c;如果无剩余的数&#xff0c;则输出-1。 输入描述&#xff1a; 输入第一行包括1个整数N&#xff0c;1<N<1000&#x…