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 <= nums.length <= 6
  • -10 <= nums[i] <= 10
  • nums 中的所有整数 互不相同

解析

这道题目是一道回溯算法问题,需要枚举出所有可能的情况。

回溯法:一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些变化抛弃该解,即回溯并且再次尝试。

深度优先搜索 算法(英语:Depth-First-Search,DFS)是一种用于遍历或搜索树或图的算法。这个算法会 尽可能深 的搜索树的分支。当结点 v 的所在边都己被探寻过,搜索将 回溯 到发现结点 v 的那条边的起始结点。这一过程一直进行到已发现从源结点可达的所有结点为止。如果还存在未被发现的结点,则选择其中一个作为源结点并重复以上过程,整个进程反复进行直到所有结点都被访问为止。

基本逻辑

 题目让我们返回一个List,我们需要定义res数组来作为返回的结果,另外需要定义一个List数组 path 作为res中的元素。我们利用Path来保证数组不重复。

在traverse,我们进行代码逻辑的书写。首先我们先遍历数组,

    for(int i = 0;i < nums.length;i++){if(path.contains(nums[i])){continue;}else{path.add(nums[i]);traverse(nums);path.remove(path.size()-1);}}

这里的逻辑是,如果当前的数字已经在Path中之后,那么我们就跳过这个数字。如果不在的话,那么我们在以这个数字为根节点去递归。注意,如果数字不在这个Path中,我们进入else条件之中,要写上  path.add(nums[i]); 并且当我们递归结束,返回到这一层递归时,要把当前数字移除path中,来进行所有数字的枚举。

变量 path 所指向的列表 在深度优先遍历的过程中只有一份 ,深度优先遍历完成以后,回到了根结点,成为空列表。

问题

出现六个空列表

在 Java 中,参数传递是 值传递,对象类型变量在传参的过程中,复制的是变量的地址。这些地址被添加到 res 变量,但实际上指向的是同一块内存地址,因此我们会看到 666 个空的列表对象。解决的方法很简单,在 res.add(path); 这里做一次拷贝即可。

修改的部分:

        if(path.size() == nums.length){res.add(new ArrayList<>(path));return;}


此时再提交到「力扣」上就能得到通过了。

代码

class Solution {//使path和res每次不跟着刷新List<Integer> path = new ArrayList<>();List<List<Integer>> res = new ArrayList<>();public List<List<Integer>> permute(int[] nums) {traverse(nums);return res;}void traverse(int[] nums){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;}else{path.add(nums[i]);traverse(nums);path.remove(path.size()-1);}}}
}

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

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

相关文章

Vue新手入门

1 Vue概述 官网:https://cn.vuejs.org/ 1、什么是Vue.js Vue.js 是目前最火的一个前端框架&#xff0c;React是最流行的一个前端框架&#xff08;React除了开发网站&#xff0c;还可以开发手机App&#xff0c; Vue语法也是可以用于进行手机App开发的&#xff0c;需要借助于W…

C语言数组的初始化方法大全

在C语言中&#xff0c;数组初始化主要有以下几种方法&#xff1a; 1&#xff0e;完全初始化&#xff1a;在声明数组的同时给出数组所有元素的值。 int arr[5] {1, 2, 3, 4, 5}; // 初始化一个整型数组 2&#xff0e;部分初始化&#xff1a;只给数组的前面一部分元素赋值&am…

Bridge 桥接

意图 将抽象部分与其显示部分分离&#xff0c;使他们都可以独立地变化。 结构 其中&#xff1a; Abstraction定义抽象类的接口&#xff0c;维护一个指向Implementer类型对象的指针。RefinedAbstraction扩展由Abstraction定义的接口。Implementor定义实现类的接口&#xff0c…

React 19 的新增功能:Action Hooks

React 是前端开发领域最流行的框架之一。我喜欢 React 是因为它背后的团队和社区对它的热情。当社区提出新功能和改进的需求时&#xff0c;团队会倾听&#xff0c;React 的未来是令人兴奋和有趣的。 让我们来看一下 React 19 中令开发人员提升开发效率的新特性。对于每个钩子&…

关于项目打包

除了自己常用的那种方式&#xff0c;也可以直接在文件夹下执行命令。 如果当前项目聚合了其他子模块的话&#xff1a; 先清理&#xff0c;再打包&#xff0c;同时跳过测试 如果打包后&#xff0c;然后项执行某个模块&#xff0c;进入当前文件夹下直接java -jar 和jar包名执行就…

C++中的vector容器

一. 基本概念 1. 包含在头文件 #include <vector> 2. 功能: 模拟了一个动态数组 3. 底层实现 首先开辟一定大小的数组 随着元素的增加&#xff0c;如果空间不够之后 自动采取扩容机制 -> 自增长 扩容规则&#xff1a;以原空间大小的 2 倍重新开辟一块空间 将就空…

【SpinalHDL】Scala编程中的class及case class

本篇文章仅简单介绍在spinalhdl编程中遇到的比较常见的2中类定义方式&#xff1a;class及case class。对于不太了解JAVA或Scala编码又开始学习SpinalHDL的人进行入门介绍。 在 SpinalHDL 中&#xff0c;case class 和 class 都是用来定义数据结构或对象的关键字&#xff0c;它…

第五十二章 进程亲和性和状态感知模式(保留模式 1) - 启动状态感知模式

文章目录 第五十二章 进程亲和性和状态感知模式&#xff08;保留模式 1&#xff09; - 启动状态感知模式维护状态感知模式并响应错误终止状态感知模式 第五十二章 进程亲和性和状态感知模式&#xff08;保留模式 1&#xff09; - 启动状态感知模式 通过设置保留模式将会话标记…

k8s:kubectl 命令设置简写启用自动补全功能

k8s&#xff1a;kubectl 命令设置简写&启用自动补全功能 1、设置kubectl命令简写2、启用kubectl自动补全功能 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; Kubernetes&#xff08;K8s&#xff09;是一个强大的容器编排平台&#xff0…

恢复MySQL!是我的条件反射,PXB开源的力量...

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是【IT邦德】&#xff0c;江湖人称jeames007&#xff0c;10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】&#xff01;&#x1f61c;&am…

[leetcode 链表] 反转链表 vs 链表相交

1. 反转链表 E :::details 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]…

【设计模式】SOLID设计原则

1、什么是SOLID设计原则 SOLID 是面向对象设计中的五个基本设计原则的首字母缩写&#xff0c;它们是&#xff1a; 单一职责原则&#xff08;Single Responsibility Principle&#xff0c;SRP&#xff09;&#xff1a; 类应该只有一个单一的职责&#xff0c;即一个类应该有且只…

js和ES的关系

ES和JS之间的关系是&#xff1a;ES&#xff08;ECMAScript&#xff09;是JS&#xff08;JavaScript&#xff09;的一个规范或者标准&#xff0c;而JS则是ES的实现。具体来说&#xff0c;JavaScript 是一种在浏览器中运行的脚本语言&#xff0c;用于实现网页的交互功能。而 ECMA…

力扣面试150 分发糖果 分步贪心

Problem: 135. 分发糖果 思路 &#x1f468;‍&#x1f3eb; 参考&#xff1a;代码随想录 一次是从左到右遍历&#xff0c;只比较右边孩子评分比左边大的情况。一次是从右到左遍历&#xff0c;只比较左边孩子评分比右边大的情况。 复杂度 时间复杂度: O ( n ) O(n) O(n) …

低成本,高效能:探索物联网新宠LoRa

LoRa是什么&#xff1f; LoRa是一种物联网无线传输技术&#xff0c;利用调制解调器实现低功耗远距离数据传输。其基本工作原理是通过基站发送数据到特定终端设备&#xff0c;实现双向数据传输。 LoRa无线传输技术是一种为低功耗和低成本设计的无线技术&#xff0c;用于实现远距…

【Linux】CentOS 7安装后没有图形界面

专栏文章索引&#xff1a;Linux 有问题可私聊&#xff1a;QQ&#xff1a;3375119339 目录 一、项目场景 二、问题描述 三、原因分析 四、解决方案 1.当前处于命令行界面&#xff0c;可以切换为图形界面 2.安装时没有安装图形界面&#xff0c;选择了Minimal Install 3.下…

鸿蒙端云一体化开发--开发云函数--适合小白体制

开发云函数 那什么是云函数&#xff1f;我们将来又怎么去使用这个云函数呢&#xff1f; 答&#xff1a;我们之前要编写一些服务端的业务逻辑代码&#xff0c;那现在&#xff0c;在这种端云一体化的开发模式下&#xff0c;我们是把服务端的业务逻辑代码&#xff0c;通过云函数来…

linux安装和使用-第一天

一. 安装linux系统 安装过程:略注意事项: 安装时一定一定一定不要选择有中文的目录包括镜像文件所在的目录,否则会发生各种问题,比如VMware Tools是灰色的.1. 安装ssh工具 (1) 安装命令 # 第一次安装系统需要更新一下apt的源,他维护了软件依赖关系,否则安装不了软件,每次安装…

网络安全教程及案例分析

一、网络安全教程 &#xff08;一&#xff09;网络安全基础知识 计算机基础知识&#xff1a;了解计算机的硬件、软件、操作系统和网络结构&#xff0c;有助于我们更好地理解网络安全的概念和技术。这些基础知识为我们提供了对计算机系统的全面认识&#xff0c;从而能够更准确…

【云计算】混合云概述

混合云概述 1.混合云定义2.云混合的形态2.1 公有云之间的混合2.2 私有云之间的混合2.3 公有云和私有云的混合2.4 公有云和传统IT的混合 3.小结 混合云 是近几年来被经常提及的一个新的云架构体系&#xff0c;根据 NIST&#xff08;美国国家标准与技术研究院&#xff09;的定义&…