首页 > 其他分享 >实现元素全排列

实现元素全排列

时间:2024-11-03 16:19:19浏览次数:3  
标签:排列 nums 实现 元素 List current int result start

嗯……继我的启蒙算法实现求集合的子集后,又总结一种类似的常用的算法(我觉得,不接受反驳)。

同样的,有递归和非递归两种方法

代码如下:

import java.util.ArrayList;
import java.util.List;

public class ArraysArrange {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        List<List<Integer>> result = new ArrayList<>();
        permute(nums, 0, result);
        for (List<Integer> list : result) {
            System.out.println(list);
        }
    }

    public static void permute(int[] nums, int start, List<List<Integer>> result) {
        // 基本情况:如果start等于nums的长度,说明已经得到一个排列
        if (start == nums.length - 1) {
            List<Integer> permutation = new ArrayList<>();
            for (int num : nums) {
                permutation.add(num);
            }
            result.add(permutation);
            return;
        }

        // 递归步骤:遍历数组,交换元素并递归
        for (int i = start; i < nums.length; i++) {
            // 交换元素
            swap(nums, i, start);
            // 递归调用,进入下一层
            permute(nums, start + 1, result);
            // 回溯:将元素换回原来的位置
            swap(nums, start, i);
        }
    }

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

非递归方式

import java.util.*;

public class ArraysArrange2 {
    public static void main(String[] args) {
        int[] nums = {1, 2, 3};
        List<List<Integer>> result = new ArrayList<>();
        backtrack(result, new ArrayList<>(), nums);
        for (List<Integer> list : result) {
            System.out.println(list);
        }
    }

    private static void backtrack(List<List<Integer>> result, List<Integer> current, int[] nums) {
        if (current.size() == nums.length) {
            result.add(new ArrayList<>(current));
            return;
        }

        for (int i = 0; i < nums.length; i++) {
            // 检查是否已经添加过nums[i]到current
            if (current.contains(nums[i])) continue;

            current.add(nums[i]);
            backtrack(result, current, nums);
            current.remove(current.size() - 1); // 回溯
        }
    }
}

标签:排列,nums,实现,元素,List,current,int,result,start
From: https://blog.csdn.net/yf3241610146/article/details/143466832

相关文章

  • 搭建主从DNS服务器实现域名正逆向解析
    1.前置工作:关闭防火墙及selinux2.安装软件:yuminstall-ybind3.本文仅搭建本地DNS实现逆向域名解析1)建议复制逆向解析模板再进行修改模板路径:/etc/named.rfc1912.zones2)进入主配置文件并添加逆向配置文件vim/etc/named.conf注意:区域名称中IP地址反向书写,只需书写网......
  • 基于SpringBoot的宠物健康咨询系统的设计与实现
    摘   要传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,宠物健康知识信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的宠物健康......
  • CoSeR桥接图像和语言以实现认知超分辨率
    CoSeR桥接图像和语言以实现认知超分辨率6.10.1CoSeR桥接图像和语言以实现认知超分辨率概述现有的超分辨率(SR)模型主要侧重于恢复局部纹理细节,往往忽略了场景中的全局语义信息。这种疏忽可能会导致在恢复过程中遗漏关键的语义细节或引入不准确的纹理。引入了认知超分辨率(CoSeR)框......
  • 扫雷程序的实现和分析
    昨天下午看了鹏哥的录播课,在自修教室学了一下扫雷,等晚上回到寝室花了一点时间写了一部分扫雷程序,今天早上起来又花了一点时间写了扫雷,终于写完了,我自己比较满意的点是全程都是自己独立完成的,最后程序运行起来也没有问题。接下来主要讲讲我对扫雷这个程序的认识,以及我觉得写扫......
  • 布谷鸟优化算法:原理、案例与代码实现
    一、引言在优化算法的领域中,布谷鸟优化算法(CuckooSearchAlgorithm)以其独特的原理和高效的性能受到了广泛关注。它模拟了布谷鸟的繁殖行为和Levy飞行模式,为解决复杂的优化问题提供了一种新颖的途径。二、布谷鸟优化算法原理(一)布谷鸟繁殖行为模拟在自然界中,布谷鸟将......
  • SpringBoot实现:高效在线试题库系统
    1绪论1.1研究背景现在大家正处于互联网加的时代,这个时代它就是一个信息内容无比丰富,信息处理与管理变得越加高效的网络化的时代,这个时代让大家的生活不仅变得更加地便利化,也让时间变得更加地宝贵化,因为每天的每分钟,每秒钟这些时间都能让人们处理大批量的日常事务,这些场......
  • 基于Django高校岗位招聘平台与数据可视化分析设计和实现
    开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql5.7(一定要5.7版本)数据库工具:Navicat11开发软件:PyCharm浏览器:谷歌浏览器后台路径地址:localhost:8080/项目名称/admin/dist/index.html前台路径地址:localhost:8080/项目名称/front/dist/index.html(无前台......
  • Python图像处理库PIL,实现旋转缩放、剪切拼接以及滤波
    文章目录切割缩放和旋转拼接PIL的Image类,提供了一些常用的图像处理方法。切割缩放和旋转PIL可以很方便地实现如下效果代码如下fromPILimportImagepath='lena.jpg'img=Image.open(path)#读取img.resize((50,50),resample=Image.Resampling.NEARES......
  • strlen函数的模拟实现
    首先我们先新建项目,并新建源文件然后先调用sring.h里的strlen函数看看该函数的效果可以看到strlen的结果为字符串"abc"的长度我们又知道对于字符串"abc"实际上在字符串尾部会存在\0,即字符串arr实际上是"abc\0"那么先定义自定义函数my_strlen使它的返回类型为int,接受的数组......
  • 使用 Elixir 实现简单的文字识别程序
    在这篇文章中,我们将手动实现一个简单的文字识别程序,使用Elixir编程语言。Elixir是一种函数式编程语言,特别适合处理并发和分布式任务。我们将通过分析图像数据,识别其中的字符。环境准备首先,请确保你已安装了Elixir。可以通过以下命令安装必要的依赖库,例如ex_image和ex_doc......