给定一个没有重复数字的序列,返回其所有可能的全排列。

示例:

输入: [1,2,3]

输出:

[

[1,2,3],

[1,3,2],

[2,1,3],

[2,3,1],

[3,1,2],

[3,2,1]

]

无奈,用swap的方法从左向右滑动,直到最后结果和最初的一致停止,只适用于三位数。。。。(改进一下让每个数字作为第一位后面的进行滑动,应该可以pass,放弃)

错:

1 classSolution {2 public static void swap(int[] nums_,int a,intb){3 int temp =nums_[a];4 nums_[a] =nums_[b];5 nums_[b] =temp;6 }7 public static boolean isEqual(int[] a,int[] b){8 for(int i = 0;i < a.length;i++){9 if(a[i] != b[i])return false;10 }11 return true;12 }13 public List> permute(int[] nums) {14 List> res = newArrayList();15 List lists = newArrayList();16 if(nums.length < 2){17 lists.add(nums[0]);18 res.add(lists);19 returnres;20 }21 int[] nums_ = new int[nums.length];22 for(int k = 0;k < nums.length;k++){23 nums_[k] =nums[k];24 lists.add(nums[k]);25

26 }27 res.add(newArrayList(lists));28 lists.removeAll(lists);29 swap(nums_,0,1);30 for(int j = 0;j < nums.length;j++){31 lists.add(nums_[j]);32 }33 res.add(newArrayList(lists));34 int i = 1;35 while(!isEqual(nums,nums_)){36 if(i+1

53 }

正确做法bt:  添加顺序就是[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]

[[1, 2, 3, 4], [1, 2, 4, 3], [1, 3, 2, 4], [1, 3, 4, 2], [1, 4, 2, 3], [1, 4, 3, 2],

[2, 1, 3, 4], [2, 1, 4, 3], [2, 3, 1, 4], [2, 3, 4, 1], [2, 4, 1, 3], [2, 4, 3, 1],

[3, 1, 2, 4], [3, 1, 4, 2], [3, 2, 1, 4], [3, 2, 4, 1], [3, 4, 1, 2], [3, 4, 2, 1],

[4, 1, 2, 3], [4, 1, 3, 2], [4, 2, 1, 3], [4, 2, 3, 1], [4, 3, 1, 2], [4, 3, 2, 1]]

TIME:O(N!*N)(整体来说)

SPACE:O(N)

1 classSolution {2

3 public List> permute(int[] nums) {4 List> res = new ArrayList<>();5 if(nums== null || nums.length ==0)returnres;6 helper(res,new ArrayList<>(),nums);7 returnres;8 }9 public void helper(List> res,List list,int[] nums){10 if(list.size() ==nums.length){11 res.add(new ArrayList<>(list));12 return;13 }14 for(int i = 0;i < nums.length;i++){15 if(list.contains(nums[i]))continue;//contaisn的时间复杂度为O(N)16 list.add(nums[i]);17 helper(res,list,nums);18 list.remove(list.size()-1);19 }20 }21

22 }

如果递归符合T(n) = T(n-1)+T(n-2)+....T(1)+T(0)  时间复杂度基本符合O(2^n),如果在其中的一些步骤可以省略,则可以简化为O(n!)

对于方法1思想的完善:

TIME:O(N)

SPACE:O(N)

1 classSolution {2

3 public List> permute(int[] nums) {4 List> res = new ArrayList<>();5 if(nums.length == 0 || nums == null)returnres;6 helper(res,0,nums);7 returnres;8 }9 public void helper(List> res,int start,int[] nums){10 if(start ==nums.length){11 List list = new ArrayList<>();12 for(intq:nums){13 list.add(q);14 }15 res.add(new ArrayList<>(list));16 return;17 }18 for(int i = start;i < nums.length;i++){19 swap(nums,start,i);20 helper(res,start+1,nums);21 swap(nums,start,i);22 }23

24 }25 public void swap(int[] nums,int l,intm){26 int temp =nums[l];27 nums[l] =nums[m];28 nums[m] =temp;29 }30

31 }

2019-05-04 10:45:10

全排列 leetcode java_LeetCode--046--全排列(java)相关推荐

  1. 全排列算法(无重复数字全排列/有重复数字全排列)/ 组合算法/ 求子集算法

    写在前面 全排列 1 无重复数字全排列 1.1 紫书版本 1.2 回溯法 2 有重复数字全排列 复盘易错点(可跳过) 写在前面 很久很久以前就想写的一篇博客,因为懒一直没开工,但是学习全排列算法算是我 ...

  2. 全排列两种实现方式(java)—poj2718

    前言 以前遇到的全排列,清一色的dfs回溯,自己知道时间复杂度挺高的,最近遇到poj2718认真总结了下全排列. 全排列:给定几个数,要求找出所有的排列方式. 法一:dfs回溯法: 思路:回溯法的核心 ...

  3. leetcode题:全排列-数组

    leetcode题:全排列 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1 ...

  4. java 全排列非递归算法_全排列的非递归算法 - osc_ivkc73ze的个人空间 - OSCHINA - 中文开源技术交流社区...

    1.全排列的定义和公式: 从n个数中选取m(m<=n)个数按照一定的顺序进行排成一个列,叫作从n个元素中取m个元素的一个排列.由排列的定义,显然不同的顺序是一个不同的排列.从n个元素中取m个元素 ...

  5. [Leetcode][第78题][JAVA][子集][位运算][回溯]

    [问题描述][中等] [解答思路] 1. 位运算 复杂度 class Solution {List<Integer> t = new ArrayList<Integer>(); ...

  6. [Leetcode][第79题][JAVA][单词搜索][DFS][回溯]

    [问题描述][中等] [解答思路] 1. DFS繁琐版本 class Solution {public boolean exist(char[][] board, String word) {bool ...

  7. [Leetcode][第40题][JAVA][数组总和2][回溯][剪枝]

    [问题描述][中等] [解答思路] 1. 减法 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Ar ...

  8. [Leetcode][第216题][JAVA][数组之和3][回溯]

    [问题描述][中等] [解答思路] 回溯 剪树枝 当和超过n 或 个数超过k 1. 正向求和 优化前 class Solution {public List<List<Integer> ...

  9. [Leetcode][第39题][JAVA][组合总和][回溯][dfs][剪枝]

    [问题描述][中等] [解答思路] 1. 回溯 import java.util.ArrayDeque; import java.util.ArrayList; import java.util.De ...

  10. [Leetcode][第77题][JAVA][组合][回溯]

    [问题描述][中等] [解答思路] 1. 回溯 class Solution {List<List<Integer>> lists = new ArrayList<> ...

最新文章

  1. Java -- JDBC 学习--批量处理
  2. 超越AlphaZero,DeepMind新算法MuZero登顶Nature | AI日报
  3. webpack加载器打包样式表中的图片和字体
  4. Python-OpenCV 杂项(二): 鼠标事件
  5. remote: Incorrect username or password ( access token ) fatal: Authentication failed for gitee
  6. webstorm jquery语法提示_WebStorm快速入门指南,开发者必备!
  7. 42. HTTP Cookie
  8. gflags的使用(转载)
  9. mysql在线修复主从同步
  10. 删除计算机网络无用设备,如何删除我的电脑/计算机中无效的设备和驱动器图标...
  11. 电子元件-继电器知识汇总
  12. 小白也能看懂的华为交换机常用命令大全
  13. idcnd传媒官方专业提供
  14. C#路径中使用斜杠/和反斜杠\的区别
  15. 条件随机场介绍(2)—— An Introduction to Conditional Random Fields
  16. 高性能电工电子电拖及自动化技术实训与考核装置
  17. 详解设计模式:组合模式
  18. 雷锋微视点:每日微博精选(2011.10.17)
  19. 【研发管理】三手项目 接盘时 必须要做的四件事
  20. 资深程序员的第三条发展道路

热门文章

  1. hadoop +hbase +zookeeper 完全分布搭建 (版本一)
  2. maven项目配置Jetty服务器
  3. 中国电信:回归根本的SOC发展之道
  4. jQuery - 获取并设置 CSS 类
  5. 多源最短路径Floyd、Floyd求最小环【模板】
  6. 运行一个程序时如何打印出执行程序的时间
  7. python六十三: __call__
  8. Fabric Kafka入门
  9. 安全技术大系iOS取证分析
  10. 让程序员薪资上升一个level的良心十条建议,你有做到吗?