java全排列(力扣Leetcode46)

全排列

力扣原题链接

问题描述

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

示例

示例 1:

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

示例 2:

输入:nums = [0,1]
输出:[[0,1],[1,0]]

示例 3:

输入:nums = [1]
输出:[[1]]

解题思路

  1. 初始化一个列表 res 用于存储结果。
  2. 调用回溯函数 backtrack,传入参数 nums 数组、当前路径 path 和标记数组 used
  3. 在回溯函数中,如果当前路径的长度等于 nums 数组的长度,则将当前路径加入结果列表中。
  4. 遍历数组 nums,如果当前数字已经被使用过,则跳过;否则将当前数字加入路径,并递归调用回溯函数。
  5. 回溯函数结束后,返回结果列表 res

算法步骤

  1. 初始化一个列表 res 用于存储结果。
  2. 调用回溯函数 backtrack,传入参数 nums 数组、当前路径 path 和标记数组 used
  3. 在回溯函数中,如果当前路径的长度等于 nums 数组的长度,则将当前路径加入结果列表中。
  4. 遍历数组 nums,依次选择未使用过的数字加入路径中。
  5. 在选择数字之前,需要进行判断:
    • 如果当前数字已经在路径中,则跳过。
  6. 将当前数字加入路径中,并标记为已使用。
  7. 递归调用回溯函数,继续寻找全排列。
  8. 回溯,撤销选择,将当前数字移出路径,并标记为未使用。
  9. 返回结果列表 res

请添加图片描述

复杂度分析

  • 时间复杂度:回溯算法的时间复杂度取决于最终的结果数量,而结果数量取决于数组 nums 的长度。假设数组 nums 的长度为 n,则时间复杂度为 O(n!)
  • 空间复杂度:回溯算法的空间复杂度取决于递归调用栈的深度和结果列表的空间占用。在递归过程中,栈的最大深度为 n,结果列表的空间占用为 O(n!),因此空间复杂度为 O(n!)

Java 代码

写法一(used数组)

使用used【i】,判断复杂度为O(1)

class Solution {List<List<Integer>> res = new ArrayList<>();// 主函数,用于找到数组中的全排列public List<List<Integer>> permute(int[] nums) {backtrack(nums, new ArrayList<>(), new boolean[nums.length]); // 回溯函数的入口return res; // 返回结果列表}// 回溯函数,用于寻找数组中的全排列private void backtrack(int[] nums, List<Integer> path, boolean[] used) {// 当路径的长度等于数组的长度时,将当前路径加入结果列表if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}// 遍历数组,依次选择未使用过的数字加入路径中for (int i = 0; i < nums.length; i++) {// 如果当前数字已经在路径中,则跳过if (used[i]) {continue;}// 将当前数字加入路径中,并标记为已使用used[i] = true;path.add(nums[i]);// 递归调用回溯函数,继续寻找全排列backtrack(nums, path, used);// 回溯,撤销选择,将当前数字移出路径,并标记为未使用path.remove(path.size() - 1);used[i] = false;}}
}
写法二

使用ArrayList的contains判断,复杂度为O(n)

class Solution {List<List<Integer>> res = new ArrayList<>();// 主函数,用于找到数组中的全排列public List<List<Integer>> permute(int[] nums) {backtrack(nums, new ArrayList<>()); // 回溯函数的入口return res; // 返回结果列表}// 回溯函数,用于寻找数组中的全排列private void backtrack(int[] nums, List<Integer> path) {// 当路径的长度等于数组的长度时,将当前路径加入结果列表if (path.size() == nums.length) {res.add(new ArrayList<>(path));return;}// 遍历数组,依次选择未使用过的数字加入路径中for (int i = 0; i < nums.length; i++) {// 如果当前数字已经在路径中,则跳过if (path.contains(nums[i])) {continue;}// 将当前数字加入路径中path.add(nums[i]);// 递归调用回溯函数,继续寻找全排列backtrack(nums, path);// 回溯,撤销选择,将当前数字移出路径path.remove(path.size() - 1);}}
}

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

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

相关文章

OpenHarmony error: signature verification failed due to not trusted app source

问题&#xff1a;error: signature verification failed due to not trusted app source 今天在做OpenHarmony App开发&#xff0c;之前一直用的设备A在测试开效果&#xff0c;今天换成了设备B&#xff0c;通过DevEco Studio安装应用程序的时候&#xff0c;就出现错误&#xf…

gpt 3d三角形 重心坐标填充 沿x轴炫赵师傅

go import pygame from pygame.locals import * import sys import math# 初始化Pygame pygame.init()# 设置窗口大小 width, height 800, 600 screen pygame.display.set_mode((width, height)) pygame.display.set_caption(3D Triangle Fill with Barycentric Coordinates)…

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 (Virtual Network Console,VNC)

Windows 远程访问 Ubuntu Desktop - 虚拟网络控制台 [Virtual Network Console&#xff0c;VNC] References 1. Desktop Sharing 2. Desktop Sharing Preferences 勾选 允许其他人查看您的桌面 勾选 要求远程用户输入此密码 取消勾选 必须为对本机器的每次访问进行确定 3. 虚拟…

vue3+vite 模板vue3-element-admin框架如何关闭当前页面跳转 tabs

使用模版: 有来开源组织 / vue3-element-admin 需要关闭的.vue 页面增加以下方法 //setup 里import {LocationQuery, useRoute, useRouter} from "vue-router"; const router useRouter(); function close() {console.log(|--router.currentRoute.value, router.cur…

椋鸟数据结构笔记#3:链表

萌新的学习笔记&#xff0c;写错了恳请斧正。 目录 链表的定义 链表的分类 方向&#xff08;单向还是双向&#xff09; 头节点&#xff08;哨兵节点&#xff09;的有无 循环或不循环 8种分类 不带头单向不循环链表的实现 带头单向循环链表的实现 链表与顺序表的差异 链…

FPGA高端项目:解码索尼IMX390 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX390 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…

Mistral 7B v0.2 基础模型开源,大模型微调实践来了

Mistral AI在3月24日突然发布并开源了 Mistral 7B v0.2模型&#xff0c;有如下几个特点&#xff1a; 和上一代Mistral v0.1版本相比&#xff0c;上下文窗口长度从8k提升到32k&#xff0c;上下文窗口&#xff08;context window&#xff09;是指语言模型在进行预测或生成文本时&…

暴雨服务器X7740赋能大模型训练

数字经济浪潮愈演愈烈,大模型训练对服务器的要求也越来越高。在此背景下,暴雨信息发布专门为大规模模型训练而设计的全新旗舰GPU服务器—X7740,以卓越的计算性能、高速网络通信能力以及创新的能效表现,有效赋能大模型训练。 X7740 搭载了暴雨信息最新一代的英特尔至强可扩展处理…

银河麒麟安装回退至GCC5.4.0 添加镜像源地址并设置其优先级。问题已解决

问题&#xff1a; 因为软件依赖低版本的gcc&#xff0c;而新版银河麒麟gcc默认时高版本&#xff0c;考虑到软件适配应该考虑最低版本的麒麟系统&#xff0c;需要将gcc降级。 过程中遇到问题&#xff0c;无法直接找到gcc5.4.0 这是没有软件源&#xff0c;需要添加其他软件源&…

mysqldump备份数据库提示ERROR 1064 (42000): You have an error in your SQL syntax

在dos下备份数据库的时候提示上面的错误信息 1 错误详情 ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near mysql-v at line 1错误示例图 2 解决办法 通过查资料…

Codeforces Round 934 (Div. 2) ---- counting is fun (Easy and Hard Version)

目录 F1. Counting Is Fun (Easy Version): 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; D2. Counting Is Fun (Hard Version)&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; F1. Counting Is Fun (Easy Version): 题目大意&#xff1a…

DAY16 二叉树最大深度最小深度完全二叉树节点个数

9.二叉树的最大深度 递归法 后序遍历 本题可以使用前序&#xff08;中左右&#xff09;&#xff0c;也可以使用后序遍历&#xff08;左右中&#xff09;&#xff0c;使用前序求的就是深度&#xff0c;使用后序求的是高度。 二叉树节点的深度&#xff1a;指从根节点到该节点…

力扣刷题Days28-66.加一(js)

目录 本题重在思路的学习与思路和代码转换实现关系的学习&#xff01; 1&#xff0c;题目 2&#xff0c;代码 3&#xff0c;学习与总结 思路回顾 1&#xff0c;题目 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。最高位数字存放在数…

Java知识点重点拓展

1.2 Java语言的特点 Java语言的广泛应用主要得益于它的核心特点&#xff0c;主要包括跨平台性、面向对象特性、安全性等。 特性描述跨平台性Java能够在多种操作系统上运行&#xff0c;这得益于JVM&#xff08;Java虚拟机&#xff09;。只要设备安装了对应的JVM&#xff0c;Jav…

MySQL Server 8.3.0 重要变更解析

MySQL Server 8.3.0 Innovation 版本是 MySQL 8.x 系列最后一个创新版本&#xff0c;下个月即将迎来 MySQL 8.4.0 LTS 长期支持版本。 关于发版模型变更&#xff0c;在之前的文章 重磅&#xff01;MySQL 8.1.0 已来&#xff01; 中已有所介绍。 这里补充一点&#xff0c;对于 M…

Java反序列化JDK动态代理的关系

Java代理模式 为什么要学习代理模式&#xff1f;了解开发原理&#xff0c;才能明白漏洞的产生。这不仅仅是SpringAOP的底层&#xff01; [SpringAOP 和 SpringMVC] 代理模式的分类&#xff1a; 静态代理动态代理 静态代理 角色分析&#xff1a; 抽象角色&#xff1a;一般会…

A Simple Problem with Integers(线段树)

目录 描述 输入 输出 样例输入 样例输出 思路 建树 第一次错误解法&#xff08;正确解法在下面&#xff0c;可跳过这一步&#xff09; 正确解法 code 描述 You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of …

java中的单例模式

一、描述 单例模式就是程序中一个类只能有一个对象实例 举个例子: //引出单例模式&#xff0c;一个类中只能由一个对象实例 public class Singleton1 {private static Singleton1 instance new Singleton1();//通过这个方法来获取实例public static Singleton1 getInstance…

【文献分享】通过形态扫描仪阐明自组装肽聚集:蛋白质-肽结构表征的新工具

题目&#xff1a;Elucidating Self‐Assembling Peptide Aggregation via Morphoscanner: A New Tool for Protein‐Peptide Structural Characterization 通过形态扫描仪阐明自组装肽聚集&#xff1a;蛋白质-肽结构表征的新工具 自组装和分子折叠在自然界中无处不在&#xff…

你该选择哪个职业呢?数据科学家、数据分析师和数据工程师

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…