leetcode 46.全排列

题目:

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

分析:

题目给的很简单,首先这个序列是一个没有重复数字的序列,所以并不需要担心你排列出来的数字是否会有不同位置有相同数字的情况,这就减少了很多结果,避免了计算量。

并且由于不是选择最优解的题目,所以一定是用深度搜索将所有的情况全部都找出。

代码:

 1 class Solution {
 2     public List<List<Integer>> all=new ArrayList();
 3     public List list=new ArrayList();
 4     public List<List<Integer>> permute(int[] nums) {
 5         boolean[] is=new boolean[nums.length];
 6         search(nums,is,0);
 7         return all;
 8     }
 9     public void search(int[] nums,boolean[] is,int total) {
10         if(total==nums.length) {
11             List ls=new ArrayList(list);
12             all.add(ls);
13             return;
14         }
15         for(int n=0;n<nums.length;++n) {
16             if(!is[n]) {
17                 list.add(nums[n]);
18                 is[n]=true;
19                 search(nums,is,total+1);
20                 list.remove(list.size()-1);
21                 is[n]=false;
22             }
23         }
24     }
25 }

我定义了一个boolean数组,每当这个数字被选择过,将其设定为true,这样不但可以避免找出的结果中会有重复数字的情况,而且还可以确保程序在一定时间结束,而不是无限循环下去。

在保存List数据的的代码处可以看到我重新声明了一个List ls来储存list列表的数据,原因很简单,因为列表中的数据在你保存到all集合中,如果对保存的列表进行更改,那么all集合中的列表也是随之变化的,也就是可以把它储存的数据看作是一个指向性的地址,而不是确定性的数据,这一点还请注意。

代码没有优化,6ms,速度上并不是很快。

原文地址:https://www.cnblogs.com/CHAHA123/p/10607669.html