【CT】LeetCode手撕—46. 全排列

news2025/1/20 22:40:40

目录

  • 题目
  • 1- 思路
  • 2- 实现
    • ⭐46. 全排列——题解思路
  • 3- ACM实现


题目

  • 原题连接:46. 全排列

1- 思路

模式识别

  • 模式1不含重复数字的数组 nums ——> 任意顺序 可能的全排列 ——> 回溯
  • 模式2全排列 ——> 排列问题,不同于组合问题 ——>
  • 回溯每次相当于枚举一个结果集,当当层结果集的长度为 nums.length 时候收集结果

为什么排列问题需要用 used 数组?

  • 排列问题关注元素的顺序,即[1, 2]和[2, 1]被视为两个不同的排列。为了生成所有可能的排列,每个元素在每个特定的排列中只能出现一次,但可以在不同的排列中重复出现。
  • used数组的作用: 在排列问题中,used数组用来跟踪每个元素是否已经被当前排列使用。这是因为每个元素在生成单个排列时只能使用一次,但在生成不同的排列时可以重新使用。used数组确保在构建每个排列时,每个元素只被选择一次。

组合问题中

  • 组合问题不关注元素的顺序,即[1, 2]和[2, 1]被视为相同的组合。组合问题通常要求选择一个子集,不考虑元素的排列顺序。
  • 组合问题中的递归调用: 在组合问题中,通常不需要used数组,因为一旦选择了一个元素,就不需要再次选择它。递归调用时,通常将下一个元素的索引传递给递归函数,这样就自然地避免了重复使用同一个元素。
  • 组合问题通过传递 startIndex 来避免递归过程中重复取元素的问题。

回溯三部曲

  • 1.回溯参数返回值
    • 参数为:参数 nums
    • 返回值为 void,通过定义 List<List<Integer>> res 收集结果
  • 2.终止条件 && 结果收集
    • 当 当前 iterm.size() == nums.length 收集结果并 return;
  • 3.回溯搜索的遍历过程
    • for(int i = 0; i<nums.length;i++)

2- 实现

⭐46. 全排列——题解思路

在这里插入图片描述

class Solution {

    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList<>();
    boolean[] used;
    public List<List<Integer>> permute(int[] nums) {
        used = new boolean[nums.length];
        Arrays.fill(used,false);
        backTracing(nums);
        return res;
    }


    public void backTracing(int[] nums){
        // 1.终止条件
        if(path.size() == nums.length){
            res.add(new ArrayList(path));
            return ;
        }

        // 2. 回溯
        for(int i = 0 ; i < nums.length ;i++){
            if(used[i]){
                continue;
            }
            used[i] = true;
            path.add(nums[i]);
            backTracing(nums);
            used[i] = false;
            path.removeLast();
        }
    
    }
}

3- ACM实现

public class permute {

    static List<List<Integer>> res = new ArrayList<>();
    static List<Integer> path = new ArrayList<>();
    static boolean[] used;
    public static List<List<Integer>> permuteFunction(int[] nums){
        used = new boolean[nums.length];
        Arrays.fill(used,false);
        backTracing(nums);
        return res;
    }

    public static void backTracing(int[] nums){
        // 2.终止条件
        if(nums.length==path.size()){
            res.add(new ArrayList<>(path));
        }
        // 3.回溯遍历搜索过程
        for(int i = 0; i < nums.length;i++){
            if(used[i]){
                continue;
            }
            used[i] = true;
            path.add(nums[i]);
            backTracing(nums);
            used[i] = false;
            path.remove(path.size()-1);
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        System.out.println("输入全排列数组长度");
        int n = sc.nextInt();
        System.out.println("输入数组值");
        int[] nums = new int[n];

        for(int i = 0 ; i < n;i++){
            nums[i] = sc.nextInt();
        }

        System.out.println("全排列的结果是");
        List<List<Integer>> forRes = permuteFunction(nums);
        System.out.println(forRes.toString());
    }
}

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

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

相关文章

PLC通过Profibus协议转Modbus协议网关接LED大屏通讯

一、背景 Modbus协议和Profibus协议是两种常用于工业控制系统的通信协议&#xff0c;它们在自动化领域中起着重要的作用。Modbus是一种串行通信协议&#xff0c;被广泛应用于各种设备之间的通信&#xff0c;如传感器、执行器、PLC等。而Profibus则是一种现场总线通信协议&…

可以把 FolkMQ 内嵌到 SpringBoot3 项目里(可内嵌的消息中间件)

之前发了《把 FolkMQ 内嵌到 SpringBoot2 项目里&#xff08;比如 “诺依” 啊&#xff09;》。有人说都淘态了&#xff0c;有什么好内嵌的。。。所以再发个 SpringBoot3 FolkMQ 是一个 “纯血国产” 的消息中间件。支持内嵌、单机、集群、多重集群等多种部署方式。 内嵌版&am…

SysTools MailXaminer: 电子邮件取证调查中的链接分析和时间线分析

天津鸿萌科贸发展有限公司是 SysTools 系列软件的授权代理商。 SysTools MailXaminer 电子邮件取证软件提供全面强大的解决方案&#xff0c;通过简化的操作&#xff0c;从电子邮件客户端、网络邮箱服务器、磁盘镜像、Skype 通讯工具中解密并搜索证据。软件对调查工作的每一阶段…

volatile原理

volatile内存语义 volatile是java提供的一种轻量级的同步机制&#xff0c;在并发编程中&#xff0c;它也扮演着比较重要的角色。一方面volatile不会造成上下文切换的开销&#xff0c;另一方面它又不能像synchronized那样保证所有场景下线程安全&#xff0c;因此必须在合适的场…

滑动窗口练习1-长度最小的子数组

1.题目链接&#xff1a;209.长度最小的子数组 2.题目描述&#xff1a; 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条…

【C++】#20,#21

#20类和对象 #include <iostream>using namespace std;class Box{public: //公有 double length; //ctrle复制本行 double width;double height;void getVolume(){ //方法带&#xff08;&#xff09; cout<<"盒子体积为&#xff1a;"<<le…

聊聊redis中的有序集合

写在文章开头 有序集合(sorted set)是redis中比较常见的数据库结构&#xff0c;它不仅支持O(logN)界别的有序的范围查询&#xff0c;同时也支持O(1)级别的单元素查询&#xff0c;基于此问题&#xff0c;本文就将从redis源码的角度分析一下有序集合的设计与实现。 Hi&#xff0…

黄仁勋最新对话:未来互联网流量将大幅减少,计算将更多即时生成

黄仁勋表示&#xff0c;未来随着设备上运行的小语言模型变得更加上下文化和生成化&#xff0c;互联网流量将大幅减少&#xff0c;计算将更多地即时生成&#xff0c;这将极大地节省能源&#xff0c;使计算模型发生根本性转变。 要点 1、黄仁勋强调生成式AI正以指数速度增长&…

C++ 65 之 模版的局限性

#include <iostream> #include <cstring> using namespace std;class Students05{ public:string m_name;int m_age;Students05(string name, int age){this->m_name name;this->m_name age;} };// 两个值进行对比的函数 template<typename T> bool …

APS计划排程系统如何打破装备使用约束

APS计划排程系统是离散制造型企业在计划控制方向的重要支撑&#xff0c;它提供的是交期预测、订单排产计划、物料采购计划、人力分配计划等等。近些几年来&#xff0c;多品种、小批量、多订单的生产模式&#xff0c;让企业的计划员应接不暇、疲累不堪&#xff0c;传统的人工经验…

js语法---理解防抖原理和实现方法

什么是防抖&#xff08;节流&#xff09; 在实际的网页交互中&#xff0c;如果一个事件高频率的触发&#xff0c;这会占用很多内存资源&#xff0c;但是实际上又并不需要监听触发如此多次这个事件&#xff08;比如说&#xff0c;在抢有限数量的优惠券时&#xff0c;用户往往会提…

白鲸开源CEO郭炜受邀参加第二届软件创新大会,探讨开源与AI融合实践下的商业模式创新

6月13日至6月14日&#xff0c;第二届软件创新发展大会在武汉光谷正式拉开帷幕。此次大会由武汉市人民政府、湖北省经济和信息化厅主办&#xff0c;国家工业信息安全发展研究中心、武汉市经济和信息化局、武汉东湖新技术开发区管理委员会共同承办&#xff0c;旨在贯彻落实国家软…

零基础入门学用Arduino 第四部分(二)

重要的内容写在前面&#xff1a; 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后&#xff0c;整体感觉是很好的&#xff0c;如果有条件的可以先学习一些相关课程&#xff0c;学起来会更加轻松&#xff0c;相关课程有数字电路…

笔记-python里面的xlrd模块详解

那我就一下面积个问题对xlrd模块进行学习一下&#xff1a; 1.什么是xlrd模块&#xff1f; 2.为什么使用xlrd模块&#xff1f; 3.怎样使用xlrd模块&#xff1f; 1.什么是xlrd模块&#xff1f; ♦python操作excel主要用到xlrd和xlwt这两个库&#xff0c;即xlrd是读excel&…

leetcode118 杨辉三角

给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows 5 输出: [[1],[1,1],[1,2,1],[1,3,3,1],[1,4,6,4,1]]示例 2: 输入: numRows 1 输出: [[1]] public List…

网络安全:探索云安全的最佳实践

文章目录 网络安全&#xff1a;探索云安全的最佳实践引言云安全简介云安全面临的挑战云安全的最佳实践数据加密身份和访问管理定期安全审计 结语 网络安全&#xff1a;探索云安全的最佳实践 引言 在我们之前的文章中&#xff0c;我们讨论了网络安全的多个方面&#xff0c;包括…

【Python特征工程系列】基于方差分析的特征重要性分析(案例+源码)

这是我的第304篇原创文章。 一、引言 方差分析&#xff08;Analysis of Variance&#xff0c;简称ANOVA&#xff09;是一种统计方法&#xff0c;用于比较两个或多个组之间的平均值是否存在显著差异。 方法简介&#xff1a; ANOVA 通过分解总方差为组间方差和组内方差&#x…

鼠情自动监测系统

TH-SH1在农业生产中&#xff0c;鼠害问题一直是困扰农民的一大难题。传统的鼠害防治方法往往依赖于大规模施药或布置捕鼠器等方式&#xff0c;这些方法不仅效率低下&#xff0c;而且容易对环境造成污染。随着科技的不断发展&#xff0c;鼠情自动监测系统应运而生&#xff0c;为…

韶关化工安全生产新篇章:可燃气体报警器的校准与检测实践

在韶关这座工业城市&#xff0c;化工行业是当地经济发展的重要支柱。然而&#xff0c;随着化工生产的不断发展&#xff0c;可燃气体泄漏的风险也日益增加。因此&#xff0c;可燃气体报警器在保障生产安全方面扮演着至关重要的角色。 在这篇文章中&#xff0c;佰德将深入探讨可…

XTDrone-无人机与无人船协同初步-配置教程

说明&#xff1a;配置该教程时所使用的是Ubuntu20.04 1 海洋与无人船仿真环境搭建 cp -r ~/XTDrone/sitl_config/usv/* ~/catkin_ws/src/ cd catkin_ws catkin build # or catkin_make 说明&#xff1a;由于官方所编写的脚本时几年之前的&#xff0c;所以很多东西不符合现在…