46. 全排列 - 力扣(LeetCode)

基础知识要求:

Java:方法、集合、泛型、Arrays工具类、数组、for循环、if判断

Python: 方法、列表、for循环、if判断

题目: 

给定一个不含重复数字的数组 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 中的所有整数 互不相同

思路解析:

为了生成一个数组的所有可能全排列,我们可以使用回溯法(backtracking)。回溯法是一种通过探索所有可能的候选解来找出所有解的算法。如果候选解被确认不是一个解(或者至少不是最后一个解),回溯算法会通过在上一步进行一些更改来丢弃该解,即“回溯”并尝试其他可能的解。

Java代码示例:

import java.util.ArrayList;  
import java.util.Arrays;  
import java.util.List;  public class Permutations {  public List<List<Integer>> permute(int[] nums) {  List<List<Integer>> result = new ArrayList<>();  int n = nums.length;  boolean[] used = new boolean[n];  List<Integer> tempList = new ArrayList<>();  backtrack(nums, used, tempList, result, 0);  return result;  }  private void backtrack(int[] nums, boolean[] used, List<Integer> tempList, List<List<Integer>> result, int first) {  if (first == nums.length) {  result.add(new ArrayList<>(tempList)); // 添加当前排列到结果中  }  for (int i = 0; i < nums.length; i++) {  if (!used[i]) { // 如果当前数字没有被使用过  used[i] = true; // 标记为已使用  tempList.add(nums[i]); // 将当前数字添加到当前排列中  backtrack(nums, used, tempList, result, first + 1); // 递归进行下一个数字的排列  tempList.remove(tempList.size() - 1); // 回溯,撤销当前选择  used[i] = false; // 回溯,撤销使用标记  }  }  }  public static void main(String[] args) {  Permutations permutations = new Permutations();  int[] nums = {1, 2, 3};  List<List<Integer>> result = permutations.permute(nums);  for (List<Integer> permutation : result) {  System.out.println(permutation);  }  }  
}

Python代码示例:

def permute(nums):  def backtrack(first = 0):  # 如果所有整数都填完了  if first == n:    output.append(nums[:])  for i in range(first, n):  # 动态地维护数组  nums[first], nums[i] = nums[i], nums[first]  # 继续递归填下一个数  backtrack(first + 1)  # 撤销操作  nums[first], nums[i] = nums[i], nums[first]  n = len(nums)  output = []  backtrack()  return output  # 示例  
nums = [1,2,3]  
print(permute(nums))

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

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

相关文章

网络原理-HTTPS协议

在前面说到HTTP中,我们通过抓包,可以看到许多信息内容,其中往往会包含一些敏感信息,这些都是明文传输,当我们的请求被黑客或者不法分子截获后,那就很危险了,因此衍生出了HTTPS协议来对传输数据进行加密。 一、加密原理 基本原理如下&#xff1a; 明文 密钥 > 密文 密文…

【一竞技DOTA2】RAMZES666替补参加裂变联赛

1、根据主办方文件,RAMZES666将继续作为Tundra战队替补参加裂变联赛。该比赛为欧洲线上赛,于5月27日-30日举行,总奖金8万美元。 除此之外,Nigma战队在上个月宣布四号位Matthew离队后,也选择启用老队员GH参赛。而在本月初让ah fu转回教练、携替补Thiolicor出战PGL瓦拉几亚的Secr…

远程户外监控组网方案,工业4G路由器ZR2000

户外监控无人值守4G工业路由器组网应用涉及工业自动化、数据传输和远程监控的重要领域。在户外没有光纤的情况下&#xff0c;想要让监控或传感器等设备联网&#xff0c;仅需一台4G工业路由器即可解决。以下是关于远程监控户外组网的详细分析与应用&#xff1a; 物联网应用场景 …

【2024系统架构设计】回顾历史,查缺补漏篇 ④

前言 hello,大家好: 💡💡💡 我们一起来备考软考高级系统架构设计师吧,本专栏提供综合知识、案例科目、论文(论点和部分示例范文)等内容,包括知识点总结和记忆小妙招哦。 🚀🚀🚀 可以减少资料查找和收集的时间,提高效率,我们一起集中精力学习干货吧! 💡…

开源浪潮与闭源堡垒:大模型未来的双重奏

从数据隐私、商业应用和社区参与等方面来看&#xff0c;开源大模型和闭源大模型各有优劣势。开源模型在透明度、社区协作和成本效益方面具有优势&#xff0c;而闭源模型在安全性、合规性和商业竞争力方面表现出色。因此&#xff0c;我更倾向于认为&#xff0c;未来的大模型发展…

#php的pecl工具#

pecl&#xff08;php拓展社区库&#xff0c;pear拓展版本&#xff09;是一个官方的php扩展仓库&#xff0c;提供了众多优秀的php扩展供开发人员使用,作用主要是给php安装php扩展 1:安装PECL 首先&#xff0c;需要确保已安装PHP和PECL。PECL通常随着PHP一起安装&#xff0c;但…

【Python】 Python中__slots__的妙用:提升性能与内存管理

基本原理 在Python中&#xff0c;每个类默认都会继承自object类&#xff0c;而object类在Python中是一个动态类&#xff0c;允许动态地添加属性和方法。这种灵活性使得Python在某些情况下非常强大和灵活&#xff0c;但同时也带来了一些性能和内存使用上的开销。 为了解决这个…

互联网十万个为什么之什么是容器?

容器是一种虚拟化技术&#xff0c;用于将应用程序及其所有依赖项打包在一起&#xff0c;以便在不同的计算环境中进行移植和运行。容器提供了一种隔离的运行环境&#xff0c;使不同应用程序能够在独立的文件系统、网络和进程空间等独立运行环境中运行&#xff0c;提升了安全性和…

Spring:事务

1. 简介 spring对jdbc进行封装&#xff0c;简化对数据库的操作 2. HelloWorld 1. 搭建模块 2.加入依赖 <dependencies><!--spring jdbc Spring 持久化层支持jar包--><dependency><groupId>org.springframework</groupId><artifactId>s…

设计模式 22 访问者模式 Visitor Pattern

设计模式 22 访问者模式 Visitor Pattern 1.定义 访问者模式是一种行为型设计模式&#xff0c;它允许你在不改变已有类结构的情况下&#xff0c;为一组对象添加新的操作。它将算法与对象结构分离&#xff0c;使你能够在不修改现有类的情况下&#xff0c;为这些类添加新的操作。…

Flink系列一:flink光速入门 (^_^)

引入 spark和flink的区别&#xff1a;在上一个spark专栏中我们了解了spark对数据的处理方式&#xff0c;在 Spark 生态体系中&#xff0c;对于批处理和流处理采用了不同的技术框架&#xff0c;批处理由 Spark-core,SparkSQL 实现&#xff0c;流处理由 Spark Streaming 实现&am…

什么是深拷贝和浅拷贝?

浅拷贝 浅拷贝是指将一个对象复制到另一个变量中&#xff0c;但是复制的是对象的地址&#xff0c;而不是对对象本身进行复制。原始对象的引用和复制对象的引用时期上是共享同一个内存地址的。 所以我们修改了复制引用指向的对象中的属性或方法&#xff0c;原始引用指向的对象…

metersphere发送kafka消息

上传jar包 设置前置脚本 import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import java.util.Properties;// Kafka 生产者配置 Properties props new Properties(); props.put("bootstrap.servers&qu…

JavaWeb_SpringBootWeb

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…

如何合并git分支

在一些情况下我得git仓库会进行一些技术分支的测试&#xff0c;我也不确定这种方案的效果会比原本的更好需要试一下&#xff0c;这种情况下我们创建一个分支进行开发&#xff0c;开发完成后确定采用这种方案再把这一分支合并到主分支。 1. 切换到主分支 git checkout master 其…

生意人【不良竟争、套人话、拉拢人、领导攻坚、授权 VS 分权】

不良竟争手法&#xff1a; 第一&#xff1a;你的真药&#xff0c;换成假药&#xff0c;来卖 第二&#xff1a;低价卖药&#xff0c;扰乱市场 第三&#xff1a;标高价格然后&#xff0c;打折来卖 公 vs 私 有别人&#xff0c;叫总经理&#xff0c;没有人在&#xff0c;叫大哥…

【电源专题】功率电感啸叫对策及案例

在文章:【电源专题】功率电感器啸叫原因及典型案例 中我们了解到了电感器啸叫的原因和一些典型电路中产生电感啸叫的案例。通过案例我们了解到很多时候啸叫来源是DC-DC转换器的功率电感器,所以如果我们要降低或消除啸叫,那有哪些对策呢? 避免流过人耳可听频率电流 首先我们…

gitee新建项目

1、新建项目后&#xff0c;在本地git clone后再复制代码进来提交 新建项目&#xff1a;https://gitee.com/projects/new 2、新建项目后&#xff0c;使用以下命令将本地已有代码关联至gitee项目 git initgit remote add origin https://gitee.com/xxx&#xff08;账号&#xf…

Spring Boot 中使用 Spring Retry 重试:再也不怕代码“掉链子”了

引言&#xff1a;生活需要重试&#xff0c;代码也一样&#xff01; 想象一下&#xff0c;你正在网上支付&#xff0c;结果网络突然卡顿&#xff0c;支付失败。这时候你会怎么做&#xff1f;当然是再试一次&#xff01;生活中我们经常会遇到各种“失败”&#xff0c;但我们会选…