leetcode习题集——46. 全排列

129 篇文章 0 订阅
42 篇文章 0 订阅

题目

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

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

算法1

public class P46_Permutations {
    List<List<Integer>> rlist = new ArrayList<>();
    public List<List<Integer>> permute(int[] nums) {
        if(nums==null||nums.length==0){
            return rlist;
        }
        List<Integer> list = new ArrayList<>();
        for(int i = 0;i<nums.length;i++){
           list.add(nums[i]);
        }
        recursion(list,new ArrayList<>());
        return rlist;
    }
    private void recursion(List<Integer> list,List<Integer> result){
        if(list.size()==0){
            rlist.add(result);
            return;
        }else {
            for(int num : list){
                List<Integer> nextList = new ArrayList<>();
                List<Integer> nextresult = new ArrayList<>();
                Integer n = num;
                nextList.addAll(list);
                nextList.remove(n);
                nextresult.addAll(result);
                nextresult.add(n);
                recursion(nextList,nextresult);
            }
        }

    }
}

思路:

  1. 将原先的nums[] 数组转换成list
  2. 每层递归对list中剩余的num遍历,这里遍历的目的是为了保证相同位置可以取到所有num,即达到了全排列的效果,循环内:
  • 从nums中移除num
  • 将num加入到新的序列nextresult中
  • 进入下一层递归
  1. 若list中为空,则result即为全排列中的一个解

算法2

public class P46_Permutations2 {
    public static void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    /**
     * 全排列函数
     *
     * @param nums
     * @param p    起始位置
     * @param q    结束位置(include)
     */
    public void perm(int[] nums, int p, int q) {

        if (p == q) {
            List<Integer> values = new ArrayList<>();
            for (int i = 0; i < nums.length; i++) {
                values.add(nums[i]);
            }
            list.add(values);
        }
        for (int i = p; i <= q; i++) {
            swap(nums, p, i);
            perm(nums, p + 1, q);
            swap(nums, p, i);
        }

    }

    List<List<Integer>> list = new ArrayList<>();

    public List<List<Integer>> permute(int[] nums) {

        perm(nums, 0, nums.length - 1);
        return list;
    }
}

思路:leetcode高性能解法,咱们重点看他的递归思路。

  1. p和q分别为起始位置和结束位置
  2. 从p到q依次遍历,i为当前遍历的下标,循环内部为:
  • 交换p和i
  • p步进1,进入下一层递归
  • 还原p和i,保证遍历到下一个i时,同层递归的nums数组是一样的

这里的递归通俗的理解就是:同一深度层次的递归将首部的p与之后的数依次做交换,交换完成进入下一层递归,最后还原p与其他数的交换,保证同层遍历p到q时,使用相同序列的nums数组。

基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip基于MATLAB实现旅行推销员问(TSP)的代码+项目说明(课程大作业)+测试数据.zip 【备注】 1、该资源内项目代码百分百可运行,请放心下载使用!有问请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值