zoukankan      html  css  js  c++  java
  • LeetCode46-全排列(递归)

    递归的使用,是真的烧脑子,只能多练。

    整个思路就是,对每个数,进行匹配。

    每次把1个数加到自己后面,再和剩下的全排列

    这道题!是没有重复数字的!这非常好做!

    举个例子

    1,2,3,4吧

                                      【1】

                                 【1、2】  【1、3】  【1、4】

                         【1、2、3】  【1、2、4】  【1、3、2】  【1、3、4】  【1、4、3】  【1、4、2】

                    【1、2、3、4】  【1、2、4、3】  【1、3、2、4】  【1、3、4、2】  【1、4、3、2】  【1、4、2、3】

    但对于2也是这样

    总的来说,就是拿上一次的结果,加上自己后,进行递归。

    递归就是循环选择数组里面还没在list里面的元素,加在后面。

    这个代码很难写,多品一品

    有个小技巧,不一定非得拿返回值,把结果存在参数里也行。这样直观一点,像全局变量一样,拿返回值很复杂

    public class LeetCode46 {
    
        public static void main(String[] args) {
    
            int [] a = {1,2,3};
    
            List<List<Integer>> res = permute(a);
    
            for(int i=0;i<res.size();i++){
                List<Integer> list = res.get(i);
                for(int j=0;j<list.size();j++){
                    System.out.print(list.get(j));
                }
                System.out.println();
            }
    
    
        }
        
        public static List<List<Integer>> permute(int[] nums) {
    
            List<List<Integer>> res = new ArrayList<>();
    
            for(int i=0;i<nums.length;i++){
                List<Integer> temp = new ArrayList<>();
                //对每个元素进行递归
                temp.add(nums[i]);
                digui(nums,temp,res);
            }
    
            return res;
        }
    
    
        //其实是每次对list和剩下的元素进行全排列
      //list是上一次的结果
    public static void digui(int nums[],List<Integer> list,List<List<Integer>> res){ //最后的递归,在这里收集数据,上一次的结果list长度和数组一样长了,就是说一次排列完成 if(list.size()==nums.length){ res.add(list); return; } for(int i=0;i<nums.length;i++){ //如果这个数字前面没出现过的话,那么就加入当前数组中,进行下一次全排列 if(!list.contains(nums[i])){ List<Integer> temp = new ArrayList<>(); for(int j=0;j<list.size();j++){ temp.add(list.get(j)); } temp.add(nums[i]); digui(nums,temp,res); } } //循环跑完了就退出了 } }
  • 相关阅读:
    C++中析构函数的作用,
    fp = fopen(s, "at") 中at 是啥意思,a 是append 追加的意思
    C++中 :: 的意思
    sed 指令
    make -e install ,,,make命令的-e选项!
    _AR="ar" _ARFLAGS="-ruv"
    gcc的-D和-U参数:宏的设置与取消 _CCFLAGS=" -w -enable-threads=posix -DLINUX -D_REENTRANT -DWORKONGN -Dlinux -D_GN_DETAIL_SDR_"
    GCC 编译详解
    RPC 编程 使用 RPC 编程是在客户机和服务器实体之间进行可靠通信的最强大、最高效的方法之一。它为在分布式计算环境中运行的几乎所有应用程序提供基础。
    vim插件ctags的安装和使用
  • 原文地址:https://www.cnblogs.com/weizhibin1996/p/9657126.html
Copyright © 2011-2022 走看看