zoukankan      html  css  js  c++  java
  • LeetCode 46.全排列

    全排列

    题目大意

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

    题目链接

    样例

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


    题目难度: 中等
    题目分类: dfs

    思路一

    分析全排列发现其实全排列就是每个数字所在的位置都变化一次,下面的代码进行变换,固定x以及x之前的数,然后变换后面的。如果看不懂下面的dfs,建议按代码手推一遍。
    class Solution {
      public void solve(List<List<Integer>> ans,ArrayList<Integer> list, int x) {
    
        	int len = list.size();
    		if(x == len) {
    			ans.add(new ArrayList<Integer>(list));
    		}
    		for(int i = x; i < len; i++) {
    			Collections.swap(list, x, i);
    			solve(ans, list, x + 1);
    			Collections.swap(list, x, i);
    		}
      }
    
      public List<List<Integer>> permute(int[] nums) {
    
    		List<List<Integer>> ans = new LinkedList();
    		ArrayList<Integer> numList = new ArrayList<Integer>();
    		for(int num : nums) {
    			numList.add(num);
    		}
    		solve(ans, numList, 0);
    		return ans;
      }
    }
    
    


    思路2

    dfs, 思路1是交换,思路2就是添加,flag[i] = 1 代表 num[i] 在当前列表中。
    class Solution {
    	public List<List<Integer>> permute(int[] nums) {
    		List<List<Integer>> ans = new ArrayList<>();
    		List<Integer> tmp = new ArrayList<>();
    		int[] flag = new int[nums.length];
    		dfs(ans, tmp, nums, flag);
    		return ans;
    	}
    
    	public void dfs(List<List<Integer>> ans, List<Integer> tmp, int[] nums, int[] flag) {
    		if(tmp.size() == nums.length) {
    			System.out.println(tmp);
    			ans.add(new ArrayList<Integer>(tmp));
    		}
    		int len = nums.length;
    		for(int i = 0; i < len; i++) {
    			if(flag[i] == 0) {
    				flag[i] = 1;
    				tmp.add(nums[i]);
    				dfs(ans, tmp, nums, flag);
    				flag[i] = 0;
    				tmp.remove(tmp.size()-1);
    			}
    		}
        }
    
    }
    
  • 相关阅读:
    系统学习DOM事件机制
    混合编程:域、桥与型变
    分层语言的混合编程
    投资第一定律
    元编程(运行时)模型
    泛型的第一性:同构、集合、抽象
    元编程沉思录
    思想是什么?经过严密的逻辑论证的观点的体系。
    编程语言概念的层次性与解释系统
    元编程沉思录(草稿)
  • 原文地址:https://www.cnblogs.com/smuzoey/p/12008110.html
Copyright © 2011-2022 走看看