【算法题解】30. 全排列的递归解法

news2024/11/30 2:35:37

这是一道 中等难度 的题

https://leetcode.cn/problems/permutations/

题目

给定一个不含重复数字的数组 n u m s nums 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 < = n u m s . l e n g t h < = 6 1 <= nums.length <= 6 1<=nums.length<=6
  • − 10 < = n u m s [ i ] < = 10 -10 <= nums[i] <= 10 10<=nums[i]<=10
  • n u m s nums nums 中的所有整数 互不相同

题解

这道题还是 递归 的思路,以示例一 n u m s = [ 1 , 2 , 3 ] nums = [1,2,3] nums=[1,2,3] 为例:

  1. 递归函数:每次选取一个未曾选取过的元素,然后进入下一次递归。
  2. 递归边界:当 n u m s nums nums 中的所有元素都被选完时,记录答案,并返回。
  3. 还原现场:每次回退时(红色箭头)应该将本次选择的元素删除。

Java 代码实现

class Solution {

    List<List<Integer>> ans = new ArrayList<>();
    List<Integer> selected = new ArrayList<>();


    public List<List<Integer>> permute(int[] nums) {

        recursion( nums);
        return ans;
    }

    private void recursion( int[] nums){
        int n = nums.length;
        // 边界条件
        if(selected.size() == n){
            ans.add(new ArrayList(selected));
            return;
        }

        for(int i = 0; i < n; i++){
            if(selected.contains(nums[i])){
                continue;
            }
            selected.add(nums[i]);
            this.recursion( nums);
            selected.remove(selected.size() - 1);
        }
        
    }
}

Go 代码实现

var (
    ans [][]int
    selectedVal []int
    selectedIndex []bool
)


func permute(nums []int) [][]int {
    
    ans = make([][]int, 0)
    selectedVal = make([]int, 0)
    selectedIndex = make([]bool, len(nums))

    recursion(nums)
    return ans
}

func recursion(nums []int) {
    if len(selectedVal) == len(nums) {
        temp := make([]int, len(selectedVal))
        copy(temp, selectedVal)
        ans = append(ans, temp)
        return
    }

    for i, v :=  range nums{
        if selectedIndex[i]{
            continue
        }

        selectedIndex[i] = true
        selectedVal = append(selectedVal, v)
        recursion(nums)
        selectedIndex[i] = false;
        selectedVal = selectedVal[:len(selectedVal) - 1]
    }
}

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

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

相关文章

景点解说二维码怎么做?一键教你轻松生成二维码

现在的各种景区为了节省人工都会将景点的详细讲解做成二维码。通过手机扫码就能自助导览。那么&#xff0c;大家知道这种景区讲解二维码是怎么制作的吗&#xff1f; 一、什么工具能制作二维码图片&#xff1f; 机智熊二维码生成器&#xff08;https://www.jzx.com/&#xff09;…

什么是高性能计算实习生?做高性能计算有前景吗?

随着大模型和算力时代的大火&#xff0c;高性能计算实习的岗位越来越多了&#xff0c;各个大厂都在码人&#xff0c;百度、小米、字节、华为等等&#xff0c;也有很多网友晒出了面试一众知名芯片企业的面经和笔试题。 但是依然有很多朋友不清楚什么是高性能计算实习生&#xf…

搜索推荐系统[10]项目实战系列Z1:手把手教学(商品搜索系统、学术文献检索)语义检索系统搭建、召回排序模型详解。

搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排)、系统架构、常见问题、算法项目实战总结、技术…

每日一练 | 网络工程师软考真题 Day12

阅读以下说明&#xff0c;答复以下【问题1】至【问题3】 【说明】 某单位有1个总部和6个分部&#xff0c;各个部门都有自己的局域网。该单位申请了6个C类IP地址202.115.10.0/24~202.115.15.0/24&#xff0c;其中总部与分部4共用一个C类地址。现方案将这些部门用路由器互联&…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

VR数字展厅——助力商企实现数字化营销展示

近年来&#xff0c;随着元宇宙、虚拟现实等概念逐渐进入大众视野&#xff0c;VR虚拟展厅也慢慢的发展成为了一种新的展示形式。VR数字展厅可以将展示场景复刻在线上&#xff0c;不再受限于线下环境&#xff0c;随着VR全景技术的高速发展&#xff0c;虚拟展厅帮助商企实现更具创…

一起CPU很闲,load却很大的案例分析

1、软硬件环境 硬件&#xff1a; 飞腾E2000Q 平台 软件&#xff1a; linux 4.19.246 2、问题现象 系统在上电后&#xff0c;无意中发现系统的平均负载很大&#xff0c;数值显示远超过cpu的承载能力。心想也没有跑什么业务程序呀&#xff0c;吓得赶紧运行top命令&#xff0c;瞅…

无人车端到端驾驶模型概述

摘要&#xff1a; 通常&#xff0c;端到端驾驶模型使用一个深度神经网络来完成这种映射&#xff0c;网络的所有参数为联合训练而得。这种方法因它的简洁高效而引人关注。 引言 在搭建无人车时&#xff0c;我和小伙伴们的主要工作是建立一个驾驶模型。所谓的驾驶模型是控制无人…

idea模板配置

idea版本&#xff1a;2023.1 未设置模板的idea&#xff0c;新建类会自动生成类注释 格式如下&#xff1a; /*** author user* date 2023/5/20 0020 14:25*/ public class User {} 其中&#xff0c;user为当前用户名 这里&#xff0c;如果希望将类注释改写成如下&#xff0…

“卷”还是“躺平”?职场人如何在工作中找到价值感?

今天不谈技术&#xff0c;只谈进步。 曾经看过一个回答说“职场人最好的姿势是仰卧起坐”。 卷累的就躺&#xff0c;休息好了再继续卷&#xff0c;卷是常态&#xff0c;“仰卧起坐”也好&#xff0c;“卷的姿势”也好&#xff0c;都是在反复“卷起”的过程中寻找一些舒适和平衡…

Z-Library2023现状

网上基本上年年都会传出来Z-Library要被干掉的消息&#xff0c;我一直觉得&#xff0c;如果那真的发生了&#xff0c;会是人类的悲哀。 由于之前我存储的地址又挂了&#xff0c;所以紧急又寻找了一下。 1.朋友帮忙 朋友帮我搜了一下&#xff0c;发现有三个地址。 他说这第一个…

智能CAN/串口协议转换器LCNET Pro RS-232/485

智能CAN/串口协议转换器LCNET Pro RS-232/485提供一路RS-485、一路RS-232和一路CAN通道&#xff0c;实现CAN与串口RS-485或RS-232之间的双向数据智能转换。每个通道独立隔离&#xff0c;每路通道采用金升阳电源模块和信号隔离芯片实现2500VDC电气隔离&#xff0c;电源输入防反设…

基于Redis的Java分布式锁,接口并发处理,并发方案

Redis的分布式锁很多人都知道&#xff0c;比如使用Jedis的setNx、incr等方法都可以实现分布式锁的功能&#xff0c;但是Jedis需要自己管理连接池&#xff0c;就稍微麻烦一点。 今天介绍的是使用RedisTemplate切面编程自定义注解SPEL来实现分布式锁的功能&#xff0c;封装完成后…

Spring Cloud 容错机试 Hystrix 服务降级 RestTemplate:

Ribon的服务降级操作 雪崩效应&#xff1a; 如果短信服务炸了后面的所有服务就会起连锁反应造成全部服务挂掉&#xff0c;这就是雪崩效应&#xff0c;那么其实短信服务又不是我们主要业务&#xff0c;这个时候我们可以采用服务降级&#xff0c;服务降级就是暂时的把短信服务停…

java学习——ArrayList和泛型(学习记录)

学习资料来自菜鸟教程 ArrayList 类是一个可以动态修改的数组&#xff0c;与普通数组的区别就是它是没有固定大小的限制&#xff0c;我们可以添加或删除元素。 ArrayList 继承了 AbstractList &#xff0c;并实现了 List 接口。 ArrayList 类位于 java.util 包中&#xff0c;使…

事件驱动模型IO模型

什么是事件驱动模型&#xff1f; 事件驱动模型是一种计算机编程模型&#xff0c;它通过等待事件的触发&#xff0c;在事件被触发时执行对应的处理函数。这种模型下&#xff0c;程序不再按照严格的顺序执行命令&#xff0c;而是以事件为驱动进行执行。事件驱动模型更适合处理大…

[RSA议题分析] Finding Vulnerabilities through Static Analysis and Scripting

文章目录 简介议题分析发现漏洞 - 什么时候/为什么什么是漏洞挖掘漏洞价值 如何挖洞逆向工程环境从哪开始挑战 总结 简介 作者讲了挖漏洞的目标&#xff0c;和一些常用的挖漏洞的方法和如果你像现在开始挖掘二进制漏洞&#xff0c;那么你可以从memcpy开始。除此之外&#xff0…

【SpringBoot系列】Spring EL表达式的简介和快速入门

介绍 Sping EL&#xff08;Spring Expression Language 简称 SpEL&#xff09;是一种强大的表达式语言&#xff0c;支持在运行时查询和操作对象&#xff0c;它可以与 XML 或基于注解的 Spring 配置一起使用。语言语法类似于统一 EL&#xff0c;但提供了额外的功能,方法调用和字…

springboot+vue藏区特产销售平台(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的藏区特产销售平台。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风…

产品经理如何使用集简云实现工作流程自动化?

场景描述 作为一名产品经理&#xff0c;需要每天面对来自各个部门的需求&#xff0c;平时的工作内容更是复杂繁琐&#xff0c;画流程图、产品开发周期、产品描述、设计团队协作&#xff0c;新产品培训会、用户需求会&#xff0c;或跟进 bug 修复等等等等…… 对内不仅要参与业…