java解决全排列问题

java解决全排列问题

全排列问题1

给定一个可包含重复数字的序列 nums ,按任意顺序返回所有不重复的全排列。

  1. 思路

我们把问题看成n个排列成一行的空格,从左往右依次填入给定的n个数,每个数只能使用一次,可以使用回溯法。
递归函数backtrack(idx, perm)表示当前排列为perm,下一个待填入的位置是第idx个位置,下标从0开始。(1)如果idx == n,说明填完了n个位置,找到了一个可行解,把perm放入结果数组中,递归结束;
(2)如果idx < n,需要考虑第idx个位置填那个数。使用标记数组visited来标记已经填过的元素,那么在填第idx个数的时候遍历给定的n个数,如果这个数没有被标记过,尝试填入,并将其标记,继续尝试下一个位置,调用backtrack(idx+1, perm)。搜索回溯时要撤销该位置填的数以及标记,并尝试其他没被标记过的数。
(3)要解决重复问题,保证填第idx个数的时候重复数字只会被填入一次。我们选择对原数组排序,保证相同的数字都相邻,然后每次填入的数一定是这个数所在重复数集合中从左往右第一个未被填过的数字。

  1. 示例
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;public class Demo {public static void main(String[] args) {int[] nums = {1, 1, 2};Solution solution = new Solution();List<List<Integer>> lists = solution.permuteUnique(nums);System.out.println(lists);}
}class Solution {boolean[] visited;public List<List<Integer>> permuteUnique(int[] nums) {List<List<Integer>> result = new ArrayList<>();visited = new boolean[nums.length];Arrays.sort(nums);List<Integer> perm = new ArrayList<>();backtrack(nums, result, 0, perm);return result;}private void backtrack(int[] nums, List<List<Integer>> result, int idx, List<Integer> perm) {if (idx == nums.length) {result.add(new ArrayList<>(perm));return;}for (int i=0;i<nums.length;i++) {if (visited[i] || (i > 0 && nums[i] == nums[i-1] && !visited[i-1]))continue;perm.add(nums[i]);visited[i] = true;backtrack(nums, result, idx + 1, perm);visited[i] = false;perm.remove(idx);}}
}

[[1, 1, 2], [1, 2, 1], [2, 1, 1]]

全排列问题2

给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以按任意顺序返回答案。

class Solution {boolean[] visited;public List<List<Integer>> permute(int[] nums) {List<List<Integer>> res = new ArrayList<>();visited = new boolean[nums.length];List<Integer> perm = new ArrayList<>();backtrace(res, nums, 0, perm);return res;}private void backtrace(List<List<Integer>> res, int[] nums, int idx, List<Integer> perm) {if (idx == nums.length) {res.add(new ArrayList<>(perm));return;}for (int i=0;i<nums.length;i++) {if (visited[i]) {continue;}perm.add(nums[i]);visited[i] = true;backtrace(res, nums, idx+1, perm);visited[i] = false;perm.remove(idx);}}
}

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

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

相关文章

Cuppa CMS v1.0 任意文件读取漏洞(CVE-2022-25578)

前言 春秋云镜靶场是一个专注于网络安全培训和实战演练的平台&#xff0c;旨在通过模拟真实的网络环境和攻击场景&#xff0c;提升用户的网络安全防护能力和实战技能。这个平台主要提供以下功能和特点&#xff1a; 实战演练&#xff1a; 提供各种网络安全攻防演练场景&#…

yolo模型训练出的.pt文件过大

当我们使用yolov8训练时候&#xff0c;保存的模型变大&#xff0c;如下图&#xff1a; 原模型 训练出来的模型 经过仔细调查&#xff0c;发现是保存的模型中多了很多数据。 原模型 训练出来的模型 只需要把文件中.pt文件读取&#xff0c;重写一遍保存。 from ultralytics im…

深入源码:解析SpotBugs (6)jvm 字节码简介

文章目录 一、JVM字节码概述一、文件结构概述二、详细解析1. 魔数和Class文件的版本2. 常量池3. 访问标志4. 类索引、父类索引与接口索引集合5. 字段表和方法表6. 属性表 字节码Spotbugs 作为一名资深的Java开发工程师&#xff0c;对JVM及其字节码有着深入的理解。现在&#xf…

Linux基于centOS7 【进度条】【Git】【gdb】学习

目录 进度条 进度条的前置准备 sleep &#xff08;秒&#xff09;& usleep&#xff08;微秒&#xff09; sleep加\n和不加\n的区别 IO函数的缓冲区 回车&换行 10秒倒计时 进度条编写 git的使用 为什么要有git&#xff08;git版本控制器&#xff09; git的主要…

windows上启动Kafka

官网下载 如&#xff1a;kafka_2.13-2.4.0.tgz 新版集成了Zookeeper ,无需另行下载 解压 至D:\Kafka\kafka_2.13-2.4.0 下 配置Kafka&#xff08;可跳过&#xff09; Zookeeper配置 kafka\config\zookeeper.properties下修改dataDir路径(Zookeeper数据目录)dataDirD:\\Program…

江科大/江协科技 STM32学习笔记P13

文章目录 TIM定时中断1、TIM简介计数器PSC预分频器ARR自动重装寄存器 2、定时器类型基本定时器主模式触发DAC 通用定时器高级定时器 3、定时器原理定时中断基本结构预分频器时序计数器时序RCC时钟树 TIM定时中断 1、TIM简介 定时器的基准时钟一般都是主频72MHz&#xff0c;如果…

Java 不可变Map练习 (2024.7.28)

CollectionExercise3 package CollectionExercise20240728;import java.util.HashMap; import java.util.Map; import java.util.Set;public class CollectionExercise3 {public static void main(String[] args) {// 不可变的Map集合// Map中键是不可以重复的// Map中的of方法…

业绩增长新引擎:智能名片如何助力销售突破

01、智能名片&#xff0c;营销增长利器 在当今竞争激烈的市场环境下&#xff0c;企业正面临着类似品牌曝光不足、销售线索获取困难、客户关系维护复杂等诸多挑战。为帮助企业解决相关难题&#xff0c;促进业绩高效增长&#xff0c;纷享营销通的 智能名片 应运而生&#xff0…

【Linux中Shell的功能】

一、Shell概念 Shell 是指一种应用程序&#xff0c;这个应用程序提供了一个界面&#xff0c;用户通过这个界面访问操作系统内核的服务。 Shell 是一个用 C 语言编写的程序&#xff0c;它是用户使用 Linux 的桥梁。Shell 既是一种命令语言&#xff0c;又是一种程序设计语言。S…

Leetcode—74. 搜索二维矩阵【中等】

2024每日刷题&#xff08;149&#xff09; Leetcode—74. 搜索二维矩阵 实现代码 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {int m matrix.size();int n matrix[0].size();int l 0;int r m * n;int mid -1…

DB-gpt + one-api + kimi-free-api 真香

# 1. 新建文件夹 one-api 和 子目录 mkdir -p /docker/one-api/data# 运行容器one-api docker run --name one-api -d --restart always -p 3333:3000 \ -e TZAsia/Shanghai -e REDIS_CONN_STRINGredis://192.168.0.3:6379 -e SYNC_FREQUENCY60 -e SQL_DSNroot:123456tcp(192.1…

springboot整合junit-用于测试用例

package impl;public interface BookDao {public void save(); }第一步&#xff1a;打开软件&#xff0c;点击file&#xff0c;点击new 然后选择module&#xff0c;在右侧选择springboot 第二步&#xff1a;选择配置和JDK以及java版本 ①选择maven类型 ②选择JDK1.8版本 ③选…

极限两边夹定理

极限两边夹定理 1. 定义 两边夹定理 (又称作夹逼定理) 说的是&#xff0c;如果一个函数 f f f 被夹在函数 g g g 和函数 h h h 之 间&#xff0c;当 x → a x \rightarrow a x→a 时&#xff0c;这两个函数 g g g 和 h h h 都收敛于同一个极限 L L L&#xff0c;那么当…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

JavaScript获取URL参数的几种方法

前言 在前端开发中&#xff0c;处理URL参数是一个常见的任务&#xff0c;尤其是在没有框架支持的情况下。虽然许多框架提供了方便的方法来获取URL参数&#xff0c;但有时我们需要依赖原生JavaScript来完成这个任务。这也是面试中经常出现的问题之一。今天让我们一起来探讨如何…

LRTimelapse Pro 7.0 安装教程

软件介绍 LRTimelapse Pro (LRT) 是一款专业的延迟摄影编辑渲染工具&#xff0c;具有高清输出、简单易用、无缝转换等特点。是非常强大的一款延迟摄影工具&#xff01;LRTimelapse Pro可以将您的影片提升一个水准。 程序可以配合 Adobe Lightroom, Adobe Camera RAW 和 Adobe…

2024年孝感中级职称报名开始了吗?

2024年孝感中级职称申报终于开始了&#xff0c;之前参加过水测的小伙伴们&#xff0c;开始准备评审了 2024年孝感本批次申报时间&#xff1a;中级、初级职称网上申报时间:2024年8月1日至8月31日。 注意&#xff1a;个人通过“湖北省职称评审管理信息系统”申报&#xff0c;须先…

Llama 3.1 重磅发布,登顶开源大模型王座!

7月23日&#xff0c;Meta正式发布迄今为止最强大的开源模型——Llama 3.1 405B&#xff0c;同时发布了全新升级的Llama 3.1 70B和8B模型。 Meta在正式发布里也附上了长达92页的论文《The Llama 3 Herd of Models》&#xff0c;揭示了Llama 3模型的技术和训练细节。 论文地址&am…

Jacoco 单元测试配置

前言 编写单元测试是开发健壮程序的有效途径&#xff0c;单元测试写的好不好可以从多个指标考量&#xff0c;其中一个就是单元测试的覆盖率。单元测试覆盖率可以看到我们的单元测试覆盖了多少代码行、类、分支等。查看单元测试覆盖率可以使用一些工具帮助我们计算&#xff0c;…

GLSL教程 第12章:现代GLSL特性

目录 12.1 现代OpenGL的特性和GLSL的兼容性 1.1 OpenGL版本及其影响 1.2 GLM与GLSL的兼容性 12.2 使用GLSL的新特性进行开发 2.1 Tessellation Shader 2.2 Compute Shader 2.3 多重渲染目标&#xff08;MRT&#xff09; 12.3 着色器的兼容性和移植性问题 3.1 兼容性问…