leetcode(46)- 全排列

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

思路

这题目很熟悉吧,小学数学,这跟昨天写的leetcode39题很像,而且比39题容易了许多,同样的这种设计到列举全部组合的问题可以画树来解决:
leetcode(46)- 全排列
可以看到,舍弃的条件是:
1、搜索长度已经达到树的深度。
2、搜索过程中如果有重复。
那么自然就是套用我们的dfs模板就行了

void dfs(int step)
{
        if(满足终止搜索条件)
        {
            终止搜索,记录数据;
            return;
        }
        
        尝试每一种搜索可能
        {
               if(不满足继续搜索的条件)
               {
					跳过这一种搜索可能;
			   }
			   
			   记录搜索数据;
               继续下一步dfs(step+1);
               恢复初始状态(回溯的时候要用到);
        }
}   

实现代码

class Solution {
    public List<List<Integer>> permute(int[] nums) {
    	List<List<Integer>> res = new ArrayList<>();
    	int len = nums.length;
    	dfs(0,nums,len,new ArrayDeque<>(),res);
    	return res;
    }
    private void dfs(int number,int[] nums,int len,Deque<Integer> path,List<List<Integer>> res)
    {
            if(number >= len)//搜索次数达到树的深度
            {
                res.add(new ArrayList<>(path));//记录搜索结果
                return;//终止继续搜索
            }
            
            for(int i = 0; i < len; i++)//尝试所有可能
            {
                   if(path.contains(nums[i]))//舍弃搜索过程中有重复的情况
                   {
    					continue;
    			   }
    			   
                   path.addLast(nums[i]);//记录搜索数据
                   number++;//记录搜索数据
    			   dfs(number,nums,len,path,res);//下一步dfs
    			   path.removeLast();//恢复回溯点状态
    			   number--;//回复回溯点状态
            }
    }   

巩固下学习的dfs咯,但是这道题目用这种方法效率是很低的。。。待优化

上一篇:p20 数组中超过一半的数字 (leetcode 46)


下一篇:图漾科技产品列表2020-02