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)


相关推荐

  • LeetCode18:4Sum

    LeetCode18:4Sum

  • mycat实现读写分离_mycat分表规则

    mycat实现读写分离_mycat分表规则主从复制,读写分离,Mycat中间件

    2022年10月13日
  • 前端必备技能之如何制作精灵图「建议收藏」

    前端必备技能之如何制作精灵图「建议收藏」为什么要用精灵图?比如京东首页的这些icon,如果每个icon都去请求一个资源。是非常浪费资源的。因为我们浏览器在同一个域名下并发加载的资源(CSS、JS、图片等)数量是有限的。我们可以将这些icon放到一张图片,通过截取这张图片的不同的区域,拿到不同的icon制作一个背景透明的Icon截图你喜欢的logo,最好是正方形。打开ps,使用快速选择工具选择白色区域ctrl+x删除…

  • 利用selenium webdriver下载不同类型的文件(pdf,txt等等)[通俗易懂]

    利用selenium webdriver下载不同类型的文件(pdf,txt等等)[通俗易懂]很多时候你需要从网站上下载不同种类的文件,像是MSExcelfile,MSWordFile,Zipfile,PDFfile,CSVfile,Textfile,等等。如果手动下载,会弹出一个保存文件的对话框。现在,seleniumwebdriver还不能处理这样的对话框。不过,你可以用别的好的seleniumwebdriver的特点去很轻松的下载文件,而不用

  • 测试用例八大要素以及设计方法

    测试用例八大要素以及设计方法测试用例(TestCase)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求测试用例八大要素1.测试用例编号由字母、字符、数字组合而成的字符串,有唯一性,易识别性。eg:1)系统测试:产品编号-ST-系统测试项名-系统测试子项名-编号2)集成测试:产品编号

  • 国内团队博客汇总_中国最成功的团队

    国内团队博客汇总_中国最成功的团队京东前端团队凹凸实验室蘑菇街技术博客奇迹空间科技有限公司百度技术沙龙百度web前端团队FEX饿了么物流悦跑圈技术团队并发编程网阿里中间件团队博客阿里技术沙龙天猫无线团队淘宝前端团队FED美团点评技术团队奇虎360技术博客alloyteam腾讯全端腾讯Bugly腾讯wetestIBMdeveloperWorks中国Glow

发表回复

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

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