zoukankan      html  css  js  c++  java
  • 【每日一题-leetcode】46.全排列

    46.全排列

    1. 全排列

    难度中等680

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

    示例:

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

    回溯算法:

     回溯算法框架
        	for 选择 in 选择列表:
            	# 做选择
            	将该选择从选择列表移除
            	路径.add(选择)
            	backtrack(路径, 选择列表)
            	# 撤销选择
            	路径.remove(选择)
            	将该选择再加入选择列表
            
        回溯算法是暴力求解,一般复杂度比较高。而动态规划存在重叠子问题 可以优化。
    
    //回溯算法
    List<List<Integer>> result = new ArrayList<>();
    
    public List<List<Integer>> permute(int[] nums) {
        if(nums == null || nums.length == 0)    return null;
        permute(nums,new LinkedList<Integer>());
        return result;
    }
    
    public void permute(int [] nums,LinkedList<Integer> track){
        //1.终止条件
        if(nums.length == track.size()){
            result.add(new LinkedList(track)); //结果集添加
            return;
        }
        for(int i=0;i<nums.length;i++){
            //2.排除不合法的选项 
            if(track.contains(nums[i]))   continue;
            //3.做选择
            track.add(nums[i]);
            //4.进入下层决策树
            permute(nums,track);
            //5.撤销选择
            track.removeLast();
        }
    }
    
  • 相关阅读:
    oracle 分析函数3
    oracle 分析函数4
    oracle 分析函数2
    postgres
    博客系统
    Java 笔试面试 算法编程篇 一
    Java 笔试面试 基础篇 一
    Struts2
    mysql 数据类型
    ExceptionDemo
  • 原文地址:https://www.cnblogs.com/qxlxi/p/12860619.html
Copyright © 2011-2022 走看看