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);
        }
    }
}

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

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

相关文章

路径规划——搜索算法详解(二):Floyd算法详解与MATLAB代码

上次总结了Dijkstra算法的案例原理与代码&#xff0c;本文分享第二种比较基础且易懂的方法为Floyd算法&#xff0c;该算法可以有效正确地处理有向图的最短路径问题&#xff0c;与Dijkstra算法不同&#xff0c;Floyd算法是一种动态规划算法&#xff0c;对于稠密图效果显著。原理…

从易到难,推荐9个适合练手的C++项目

老有一些同学和我说学习了 C 以后&#xff0c;想要做些项目锻炼自己&#xff0c;让我从「简单到难」都推荐一些。 那有啥说的&#xff0c;必须推荐&#xff01;毕竟 C 的优质项目我见过太多了&#xff01; 下面我就按照「从易到难」的梯度&#xff0c;依次来推荐&#xff0c;…

你真的会数据结构吗:二叉树

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ halo铁汁们&#xff0c;没错又是你们人见人爱&#xff0c;花见花开的大伟啊&#xff0c;今天也是周六&#x…

JHY-31复合电压继电器 额定电压Un=110VDC 板后接线 JOSEF约瑟

用途&#xff1a; JHY-31复合电压继电器使用于电力系统的继电保护线路中&#xff0c;作为各种类型故障的判别元件和电压闭锁元件。 继电器型号名称&#xff1a; 例:辅助直流工作电压为110V的复合电压继电器的订货代号为: JHY-31/110V。 工作原理&#xff1a; 继电器内部具有负…

OpenFeign 基本介绍

OpenFeign能干什么 前面在使用SpringCloud LoadBalancerRestTemplate时&#xff0c;利用RestTemplate对http请求的封装处理形成了一套模版化的调用方法。但是在实际开发中&#xff0c; 由于对服务依赖的调用可能不止一处&#xff0c;往往一个接口会被多处调用&#xff0c;所以…

浏览器工作原理与实践--垃圾回收:垃圾数据是如何自动回收的

在上一篇文章中&#xff0c;我们提到了JavaScript中的数据是如何存储的&#xff0c;并通过例子分析了原始数据类型是存储在栈空间中的&#xff0c;引用类型的数据是存储在堆空间中的。通过这种分配方式&#xff0c;我们解决了数据的内存分配的问题。 不过有些数据被使用之后&am…

Codeforces Round 850 (Div. 2) D. Letter Exchange

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

拥抱挑战,开启增长:2024年全球产品团队的OKR策略

2024年&#xff0c;全球经济格局进入重塑阶段。消费者在消费选择上趋于严苛&#xff0c;企业需推出更具吸引力的产品与服务&#xff0c;以赢得消费者的青睐。同时&#xff0c;企业需通过持续创新&#xff0c;提升产品竞争力&#xff0c;方能在充满挑战的市场环境中实现持续增长…

node.js学习(2)

版权声明 以下文章为尚硅谷PDF资料&#xff0c;B站视频链接&#xff1a;【尚硅谷Node.js零基础视频教程&#xff0c;nodejs新手到高手】仅供个人学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;…

Jmeter 从登录接口提取cookie 并 跨线程组调用cookie (超详细)

文章目录 一、开始前的准备二、 业务场景介绍三、从登录接口提取cookies四、跨线程组调用cookies 一、开始前的准备 1、安装Jmeter&#xff0c;参考文章&#xff1a;JMeter 3.1 和JMeterPlugin的下载安装 2、设置配置文件使Cookie管理器保存cookie信息。 修改apache-jmeter-x…

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

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

安装和使用 Oracle Database 23c 容器鏡像

Oracle Database 23c 是 Oracle 最新的数据库版本&#xff0c;它带来了许多新特性和性能改进。 对于开发者来说&#xff0c;Oracle 提供了一个免费的开发者版&#xff0c; 可以通过 Docker 容器轻松安装和使用。以下是详细的安装和使用指南。 安装 Docker 在开始之前&#xff0…

FME学习之旅---day17

我们付出一些成本&#xff0c;时间的或者其他&#xff0c;最终总能收获一些什么。 【FME-HOW-TO系列】28 栅格邻域函数 RasterConvolver转换器说明&#xff1a; 接受包含栅格几何对象的输入要素&#xff0c;并在对所有波段应用卷积滤波 器后输出要素。 本人对栅格数据处理的较…

npm mongoose包下载冲突解决之道

我在新电脑下载完项目代码后,运行 npm install --registryhttps://registry.npm.taobao.org 1运行就报错&#xff1a; npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree npm ERR! npm ERR! While resolving: lowcode-form-backend1.0.0 npm …

Find Any File (FAF) for Mac:您的专属文件搜索神器

在数字时代&#xff0c;我们的Mac硬盘中堆积着各式各样的文件&#xff0c;从工作文档到家庭照片&#xff0c;从音乐视频到学习资料&#xff0c;无一不体现出我们的生活和工作的丰富多彩。然而&#xff0c;当我们需要快速找到某个特定文件时&#xff0c;却常常在茫茫文件海中迷失…

送朋友的生日祝福静态页面代码!(小白也能轻松GET!)

Hey亲爱的小白们&#xff01;&#x1f44b; 知道你们想给朋友一个独特又有心的生日祝福&#xff0c;却苦于没有编程基础吗&#xff1f;别担心&#xff0c;来白嫖&#xff01;&#x1f381; &#x1f680;【生日祝福静态页面代码】来啦&#xff01;只需简单几步&#xff0c;就能…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

【LV16 day1 自动mknod】

一、起源 仅devfs&#xff0c;导致开发不方便以及一些功能难以支持&#xff1a; 热插拔 不支持一些针对所有设备的统一操作&#xff08;如电源管理&#xff09;不能自动mknod用户查看不了设备信息设备信息硬编码&#xff0c;导致驱动代码通用性差&#xff0c;即没有分离设备和…

Web前端—(原生JS)歌词滚动效果

歌词滚动效果实现 歌词滚动效果HTML部分CSS部分JS部分解析歌词字符串&#xff0c;得到歌词的对象数组计算在当前情况下&#xff0c;播放器播放到第几秒的情况创建歌词元素设置ul元素的偏移量最后对时间变化的事件进行监听完整JS代码 歌词滚动效果 实现效果如图所示&#xff1a…

防静电工作台:静电敏感环境下的必备设备

在当今的电子制造、精密仪器制造、化学实验室等领域&#xff0c;静电敏感性已成为一个不可忽视的问题。静电可能对设备和操作人员造成严重损害&#xff0c;因此防止静电的产生和传导是至关重要的。在这样的背景下&#xff0c;防静电工作台应运而生&#xff0c;成为这些领域中不…