LeetCode–046–全排列(java)

LeetCode–046–全排列(java)给定一个没有重复数字的序列,返回其所有可能的全排列。示例:无奈,用swap的方法从左向右滑动,直到最后结果和最初的一致停止,只适用于三位数。。。。(改进一下让每个数字作为第一位后面的进行滑动,应该

大家好,又见面了,我是你们的朋友全栈君。

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

示例:

输入: [1,2,3]
输出:
[
  [1,2,3],
  [1,3,2],
  [2,1,3],
  [2,3,1],
  [3,1,2],
  [3,2,1]
]

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

错:

 1 class Solution {  2 public static void swap(int[] nums_,int a,int b){  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<List<Integer>> permute(int[] nums) { 14 List<List<Integer>> res = new ArrayList(); 15 List<Integer> lists = new ArrayList(); 16 if(nums.length < 2){ 17 lists.add(nums[0]); 18  res.add(lists); 19 return res; 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(new ArrayList(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(new ArrayList(lists)); 34 int i = 1; 35 while(!isEqual(nums,nums_)){ 36 if(i+1<nums.length){ 37 swap(nums_,i,i+1); 38 if(!isEqual(nums,nums_)){ 39  lists.removeAll(lists); 40 for(int j = 0;j < nums.length;j++){ 41  lists.add(nums_[j]); 42  } 43 res.add(new ArrayList(lists)); 44  } 45 i++; 46 }else{ 47 i = 0; 48  } 49  } 50 return res; 51  } 52 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 class Solution {  2  3 public List<List<Integer>> permute(int[] nums) {  4 List<List<Integer>> res = new ArrayList<>();  5 if(nums== null || nums.length ==0)return res;  6 helper(res,new ArrayList<>(),nums);  7 return res;  8  }  9 public void helper(List<List<Integer>> res,List<Integer> 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 class Solution {  2  3 public List<List<Integer>> permute(int[] nums) {  4 List<List<Integer>> res = new ArrayList<>();  5 if(nums.length == 0 || nums == null)return res;  6 helper(res,0,nums);  7 return res;  8  }  9 public void helper(List<List<Integer>> res,int start,int[] nums){ 10 if(start == nums.length){ 11 List<Integer> list = new ArrayList<>(); 12 for(int q: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,int m){ 26 int temp = nums[l]; 27 nums[l] = nums[m]; 28 nums[m] = temp; 29  } 30 31 }

 

2019-05-04 10:45:10

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/155567.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 怎么发现RAC环境中&#39;library cache pin&#39;等待事件的堵塞者(Blocker)?「建议收藏」

    怎么发现RAC环境中&#39;library cache pin&#39;等待事件的堵塞者(Blocker)?

  • linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)

    linux vi命令 退出不保存,linux vi保存退出命令(如何退出vi)若用户真的希望用文件的当前内容替换newfile中原有内容,可使用命令:q!Vi放弃所作修改而直接退到shell下,则Vi在显示窗口的状态行给出提示信息:Fileexists(use!tooverride)此时,在末行模式下,。在末行模式下,若在用此命令退出Vi时,返回到shell;若当前编辑的文件没被修改过,输入命令:wqVi将先保存文件,输入命令:wVi保存当前编辑…

  • C++版OpenCV使用神经网络ANN进行mnist手写数字识别[通俗易懂]

    C++版OpenCV使用神经网络ANN进行mnist手写数字识别[通俗易懂]说起神经网络,很多人以为只有Keras或者tensorflow才支持,其实OpenCV也支持神经网络的,下面就使用OpenCV的神经网络进行手写数字识别,训练10次的准确率就高达96%。环境准备:vs2015OpenCV4.5.0以下为ANN神经网络的训练代码:#include<iostream>#include<opencv.hpp>#include<string>#include<fstream>usingnamespacestd

  • 苹果手机数据转移到新手机_旧手机数据转移到新手机,一键免费传输

    苹果手机数据转移到新手机_旧手机数据转移到新手机,一键免费传输这款软件所有人都能用到建议收藏备用当我们换新手机时是不是很多数据需要转移很繁琐费劲电话号短信备注等等都想留着解决办法来了!!!今天推送的这款神器是腾讯旗下唯一一款零差评的app这款软件真正解决了我们平时更换手机遇到的所有痛点,没有GG无需会员软件名字:换机助手(适用于安卓iOS)01软件介绍现在随着互联网的发展,智能手机几乎人手必备,而且大家更换手机的频率越来越高,更换手机时候,…

  • 数列所有公式大全_splay树

    数列所有公式大全_splay树请写一个程序,要求维护一个数列,支持以下 6 种操作:(请注意,格式栏 中的下划线 _ 表示实际输入文件中的空格)输入格式第 1 行包含两个数 N 和 M,N 表示初始时数列中数的个数,M 表示要进行的操作数目。第 2 行包含 N 个数字,描述初始时的数列。以下 M 行,每行一条命令,格式参见问题描述中的表格。输出格式对于输入数据中的 GET-SUM 和 MAX-SUM 操作,向输出文件依次打印结果,每个答案(数字)占一行。数据范围与约定你可以认为在任何时刻,数列中至少有 1 个数。输入

  • docker(11)Dockerfile 中的COPY与ADD 命令[通俗易懂]

    docker(11)Dockerfile 中的COPY与ADD 命令[通俗易懂]前言Dockerfile中提供了两个非常相似的命令COPY和ADD,本文尝试解释这两个命令的基本功能,以及其异同点,然后总结其各自适合的应用场景。Build上下文的概念在使用dock

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号