【LeetCode】46-全排列
题目描述
给定一个没有重复数字的序列,返回其所有可能的全排列。
示例:
输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]
解题思路
回溯法
设置一个指针first表示当前正在处理的元素,n表示数组nums的长度。
- 如果first == n表示此时的全排列已经完成,把此时的列表加入到结果列表
- 对数组从索引first到n-1进行遍历- 将nums[first]与nums[i]进行交换
- 继续(递归地)进行交换处理,接下来backtrack(first + 1)
- 得到一组全排列后,要将数组恢复成交换之前的样子,以免在获取下一组全排列的过程中出错
 
- 将
Java 实现
public List<List<Integer>> permute (int[] nums) {
    List<List<Integer>> ans = new ArrayList<>();
    ArrayList<Integer> curList = new ArrayList<>();
    for (int num : nums) {
        curList.add(num);
    }
    int n = nums.length;
    backtrack(0, curList, n, ans);
    return ans;
}
private void backtrack (int first, ArrayList<Integer> curList, int n, List<List<Integer>> ans) {
    if (first == n) {
        ans.add(new ArrayList<Integer>(curList));
    }
    for (int i = first; i < n; i++) {
        Collections.swap(curList, first, i);
        backtrack(first + 1, curList, n, ans);
        Collections.swap(curList, first, i); // 回溯,使数组回到原来的样子重新操作
    }
}
心得体会
这一题的回溯算法体现在:交换完获得一组全排列后,要及时将数组交换回去,保持原样给下一次交换操作使用。
【LeetCode】46-全排列的更多相关文章
- 每日一题-——LeetCode(46)全排列
		题目描述: 给定一个没有重复数字的序列,返回其所有可能的全排列.输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ... 
- Java实现 LeetCode 46 全排列
		46. 全排列 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2] ... 
- [leetcode] 46. 全排列(Java)
		46. 全排列 这题我们可以借用31. 下一个排列写的nextPermutation函数来做,稍微改造一下即可 注意要先给nums排个序 class Solution { // 当没有下一个排列时re ... 
- leetcode 46. 全排列 及 47. 全排列 II
		46. 全排列 问题描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3 ... 
- [LeetCode] 46. 全排列(回溯)
		###题目 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ... 
- LeetCode 46 全排列
		题目: 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3 ... 
- LeetCode 46. 全排列(Permutations)
		题目描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [ ... 
- LeetCode 46——全排列
		1. 题目 2. 解答 给定一个序列,序列中的任意一个数字都可以作为全排列的最后一位.然后,其余位置元素的确定便是剩余元素的一个全排列,也就是一个子问题. 例子中 [1, 2, 3] 的全排列,最后一 ... 
- leetcode 46 全排列 (python)
		给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3]输出:[ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] ... 
- 力扣Leetcode 46. 全排列
		全排列 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], ... 
随机推荐
- 【Java笔记】【Java核心技术卷1】chapter3 D5运算符
			package chapter3; import java.math.*; //引入数学类 //枚举类型 enum Size{SMALL,MEDIUM,LARGE}; public class D5运 ... 
- javascript 异步请求封装成同步请求
			此方法是异步请求封装成同步请求,加上token验证,环境试用微信小程序,可以修改文件中的ajax,进行封装自己的,比如用axios等 成功码采用标准的 200 到 300 和304 ,需要可以自行修改 ... 
- JAVA-SpringMVC 概述及组件介绍
			一.SpringMVC概述 SpringMVC是一个WEB层.控制层框架,主要用来负责与客户端交互,业务逻辑的调用. SpringMVC是Spring家族中的一大组件,Spring整合SpringMV ... 
- 容易上手搭建vue2.0开发环境
			第一步:安装node 前端开发框架和环境都是需要 Node.js ,先安装node.js开发环境,vue的运行是要依赖于node的npm的管理工具来实现,下载https://nodejs.org/en ... 
- 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗
			100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ... 
- python(自用手册)导图
- IDEA编辑器
			一.打开含有jsx语法的文件都会显示红线,提示export declarations are not supported bu current javascript version 解决办法: 二.I ... 
- nginx之gzip压缩提升网站速度
			目录: 为啥使用gzip压缩 nginx使用gzip gzip的常用配置参数 nginx配置gzip 注意 为啥使用gzip压缩 开启nginx的gzip压缩,网页中的js,css等静态资源的大小会大 ... 
- wav封装格式
			wav文件格式作为一种常用的多媒体音频文件格式,其由MS在1991年8月在Windows 3.1上推出,文件扩展名为WAV,是WaveFom的简写.通常存储未压缩的pcm数据,也可存储压缩的pcm数据 ... 
- springboot 项目的https的发布
			1.生成密钥证书 生成命令: keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keystore keysto ... 
