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

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • YUV文件格式[通俗易懂]

    YUV文件格式[通俗易懂]原文:YUV图像格式的博客转:https://blog.csdn.net/armwind/article/details/52190123,文章不错特转载过来备忘一.YUV数据格式的定义和采集方式1)YUV数据格式定义     YUV分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V”表示的则是色度(Chrominance或Chroma)…

    2022年7月16日
    20
  • 大话无线通讯基础之:WIFI和5G信道划分

    大话无线通讯基础之:WIFI和5G信道划分目前主流的无线WIFI网络设备802.11a/b/g/n/ac:各种协议的数据传输率:80211.a协议支持的数据传输率:6、9、12、18、24、36、48和54Mbps80211.b协议支持的数据传输率:1、2、5.5和11Mbps80211.g协议支持的数据传输率:6、9、12、18、24、36、48和54Mbps;可以降级到1、2、5.5…

    2022年5月2日
    102
  • 山东省计算机考试模拟,山东省高校计算机等级考试VB考试模拟系统使用说明

    山东省计算机考试模拟,山东省高校计算机等级考试VB考试模拟系统使用说明

    2021年11月28日
    39
  • CSS3选择器 | 每个前端开发者必须要掌握的技术

    CSS3选择器 | 每个前端开发者必须要掌握的技术目录属性选择符伪类选择符CSS3属性CSS3自适应属性选择符如果能够灵活运用属性选择器,目前为止需要依靠id或class名才能实现的样式完全可以使用属性选择器来实现。E[att]{}:选择具有att属性的E元素E[att=”val”]{}:选择具有att属性且属性值等于val的E元素E[att~=”val”]{}:用于选取属性值中包含指定词汇的元素E[att|=”val…

    2022年7月27日
    9
  • 鱼和水的故事

    鱼和水的故事,那两句对白很经典,几乎谁都知道,但却很少人知道故事的全篇。鱼说:“你看不见我眼中的泪,因为我在水中。” 水说:“我能感觉得到你的泪,因为你在我心中。”http://hove

    2021年12月25日
    41
  • 雷达测距和超声波测距_超声波测距的原理是什么

    雷达测距和超声波测距_超声波测距的原理是什么本实验是基于MSP430利用HC-SR04超声波传感器进行测距,测距范围是3-65cm,讲得到的数据显示在LCD1602液晶屏上。模块工作原理如下(1)采用IO触发测距,给至少10us的高电平信号;(2)模块自动发送8个40khz的方波,自动检测是否有信号返回;(3)有信号返回,通过IO输出一高电平,高电平持续的时间就是超声波从发射到返回的时间(4计算测试距离测试距离=(高电平时间*声速(340M/S))/2;根据工作原理,我们可以选择两种模式驱动1.采用中断+定时器

    2025年9月3日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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