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]
    ]

    (二)思路分析:

      1 先将第一个数固定住,然后对后面的所有数字进行全排列

      2 将第二个数字放到第一个位置上,在对第一个之后的数字进行全排列

      3 如此下去,直到start在末尾位置,只对末尾一个值排列

      LeetCode  AC代码

    public class Solution {
        // 最终返回的结果集
        static List<List<Integer>> res = new ArrayList<List<Integer>>();
        public static List<List<Integer>> permute(int[] nums) {
            int len = nums.length;
            if (len==0||nums==null)  return res;
    
            // 采用前后元素交换的办法,dfs解题
            exchange(nums, 0, len);
            return res;
        }
    
        public static void exchange(int[] nums, int i, int len) {
            // 将当前数组加到结果集中
            if(i==len-1) {
                List<Integer> list = new ArrayList<>();
                for (int j=0; j<len; j++){
                    list.add(nums[j]);
                }
                res.add(list);
                return ;
            }
            // 将当前位置的数跟后面的数交换,并搜索解
            for (int j=i; j<len; j++) {
                swap(nums, i, j);
                exchange(nums, i+1, len);
                swap(nums, i, j);
            }
        }
        public static void swap(int[] nums, int i, int j) {
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        
    }

       


    (三)递归实现

    public class Test {
        public static void main(String[] args) {
            int[] a = {1,2,3};
            //对0位置开始的所有值全排列
            f(a, 0);
        }
        private static void f(int[] a, int start) {
            /*    start
             *     |
             *     1,2,3
             *     i 
             *     *)在start位置,固定一个值
             *     *)对start+1后面的值全排列
             */
            //最简问题
            //start在末尾位置,只对末尾一个值排列
            if(start==a.length-1) {
                System.out.println(Arrays.toString(a));
                return;
            }
            for(int i=start; i<a.length; i++) {
                //i和start位置交换
                swap(a, i, start);
                f(a, start+1);//递归对start+1之后的值全排列
                //再交换回来,否则会引起数据混乱
                swap(a, i, start);
            }
        }
        private static void swap(int[] a, int i, int j) {
            int t = a[i];
            a[i] = a[j];
            a[j] = t;
        }
    }
  • 相关阅读:
    How to Set Up an Rsync Daemon on Your Linux Server
    VMware workstation 设定开机引导等待时间
    Debian Buster Nginx 布署 Brophp 项目(类 Thinkphp)
    Laravel
    Debian 利用 iso 镜像完全离线更新 apt-cdrom
    Debian 采用 iso 镜像作为 apt 源
    Laravel中用GuzzleHttp
    Nginx详解(正向代理、反向代理、负载均衡原理)
    Debian Buster 配置 Laravel 运行环境(nginx + redis + supervisor)
    How to Install and Configure Bind 9 (DNS Server) on Ubuntu / Debian System
  • 原文地址:https://www.cnblogs.com/misscai/p/9927157.html
Copyright © 2011-2022 走看看