• leetcode 46 Permutations ----- java


    Given a collection of distinct numbers, return all possible permutations.

    For example,
    [1,2,3] have the following permutations:

    [
      [1,2,3],
      [1,3,2],
      [2,1,3],
      [2,3,1],
      [3,1,2],
      [3,2,1]
    ]

    给定一个数组,求所有的排列组合。

    做出这道题很简单,主要是要比较快的速度,第一次做,耗时5ms,比较慢,主要就是用递归,每次向arraylist中放入一个数(不重复),放够数目的数就result.add();

    public class Solution {
        public List<List<Integer>> permute(int[] nums) {
    		
    		List<List<Integer>> result = new ArrayList<List<Integer>>();
    		if( nums.length == 0)
    			return result;
    		getResult(result,nums,new ArrayList<Integer>(),0);
    		return result;
        }
    	
    	public static void getResult(List<List<Integer>> result,int[] nums,ArrayList<Integer> ans,int num){
    		if( num == nums.length){
    			result.add(new ArrayList<Integer>(ans));
    			return ;
    		}
    		for( int i = 0 ;i <nums.length;i++){
    			if( !ans.contains(nums[i]) ){
    				ans.add(nums[i]);
    				getResult(result,nums,ans,num+1);
    				ans.remove((Integer)nums[i]);
    			}
    		}	
    	}
    }
    

     还有一种方法,用迭代,一个数字的时候,就是数字本身,两个数字的时候,就是将第二数字放在第一个数字的左边和右边两种,然后依次类推,在第n个数字的时候,就是在n-1的基础上,每一个空位(每个数字的左边和右边,共n个)放入第n个数字。耗时4ms

    public class Solution {
        public static List<List<Integer>> permute(int[] nums) {
    
    		List<List<Integer>> result = new ArrayList<List<Integer>>();
    		if (nums.length == 0)
    			return result;
    		List<Integer> l0 = new ArrayList<Integer>();
    		l0.add(nums[0]);
    		result.add(l0);
    		for( int i = 1;i<nums.length;i++){
    			List<List<Integer>> l1 = new ArrayList<List<Integer>>();
    			for( List<Integer> ll : result ){
    				for(int j =0; j<=i;j++ ){
    				    List<Integer> l2 = new ArrayList<Integer>(ll);
    					l2.add(j, nums[i]);
    					l1.add(l2);	
    				}
    			}
    			result = l1;			
    		}
    		return result;
    	}
    }
    

     讲两种方法综合一下,递归+迭代,这样是3ms

    public class Solution {
        public List<List<Integer>> permute(int[] nums) {
    	    List<List<Integer>> result = new ArrayList<List<Integer>>();
    	    List<Integer> element = new ArrayList<Integer>();
    	    getResult(result, element, nums, 0);
    	    return result;
    	}
    
    	private void getResult(List<List<Integer>> result, List<Integer> element, int[] nums, int n){
    	    if(n==nums.length){
    	        result.add(element);
    	        return;
    	    }
    
    	    int size = element.size();
    	    for(int i = 0; i <= size; i++){
    	        List<Integer> temp = new ArrayList<Integer>(element); 
    	        temp.add(i,nums[n]);
    	        getResult(result, temp, nums, n+1);
    	    }
    	    return;
    	}
    }
    

     然后还有一种方法,有n位数,那么第1位有n种情况,在确定第一位的情况下,第2位就有n-1种情况,以此类推,使用数组就可以使运行时间更快,用时2ms

    public class Solution {
        public List<List<Integer>> permute(int[] nums) {
    		List<List<Integer>> result = new ArrayList<List<Integer>>();
    		if (nums.length == 0)
    			return null;
    		int len = nums.length - 1;
    		result = getResult(nums, 0, len, result);
    		return result;
    	}
    
    	public List<List<Integer>> getResult(int[] nums, int k, int len,
    			List<List<Integer>> result) {
    
    		if (k == len) {
    			List<Integer> subList = new ArrayList<Integer>();
    			for (int i = 0; i < nums.length; i++) {
    
    				subList.add(nums[i]);
    			}
    			result.add(subList);
    		} else {
    			for (int i = k; i <= len; i++) {
    
    				int temp = nums[k];
    				nums[k] = nums[i];
    				nums[i] = temp;
    				getResult(nums, k + 1, len, result);
    				int temp1 = nums[k];
    				nums[k] = nums[i];
    				nums[i] = temp1;
    
    			}
    
    		}
    
    		return result;
    	}
    }
    
  • 相关阅读:
    第一节 软件测试概述(2)
    第一节 软件测试概述(1)
    Sql语句,查询效率
    Js cdn 学习
    Java内部类详解
    UML用例图
    UML类图几种关系的总结
    JFinal框架_定时触发程序
    利用EXCEL函数LINEST进行统计学中的回归分析
    Windows 10 64 Bit 编译安装 PyLucene 8.3.0
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/5686683.html
Copyright © 2020-2023  润新知