【番外篇】排列组合实现算法2(Java版)

news2025/1/28 1:16:28

一、说明

在牛客网的很多算法试题中,很多试题底层都是基于排列组合算法实现的,比如动态规划、最优解、最大值等常见问题。排列组合算法有一定的难度,并不能用一般的多重嵌套循环解决,没有提前做针对性的学习和研究,考试时候肯定是事倍功半,所以今天我们专门出一篇文章来讲一下这个问题。

排列个数的计算公式如下:

组合个数的计算公式如下:

二、放回再取问题

1、问题1:

假设袋子里有编号为1,2,...,m这m个球。现在每次从袋子中取一个球几下编号,放回袋中再取,取n次作为一组,枚举所有可能的情况。

分析:每一次取都有m种可能的情况,因此一共有种情况。

package xu.com.coder.test;

import java.util.Stack;

/**
 * @author xulijun
 */
public class Recursion1Test {

    static Stack<Integer> stack = new Stack<Integer>();
    static int count = 0;

    public static void main(String[] args) {

        int[] data = {1, 2, 3, 4};
        recursion(data, 3, 0);
        System.out.println(count);

    }

    /**
     * 递归方法,当实际选取的数目与要求选取的数目相同时,跳出递归
     *
     * @param dataArray 数组
     * @param selectNum 要选取的数目
     * @param curNum    当前已经确定的个数
     */
    public static void recursion(int[] dataArray, int selectNum, int curNum) {

        if (curNum == selectNum) {
            count++;
            System.out.println(stack);
            return;
        }

        for (int item : dataArray) {
            stack.push(item);
            recursion(dataArray, selectNum, curNum + 1);
            stack.pop();
        }
    }

}

运行结果:

 三、排列问题

问题2:        

假设袋子里有编号为1,2,...,m这m个球。先后从袋子中取出n个球,依次记录编号,不同顺序是一组不同的排列,枚举所有可能的情况。

分析:这是排列问题,应该有种情况。

package xu.com.coder.test;

import java.util.Stack;

/**
 * @author xulijun
 */
public class Recursion2Test {

    static Stack<Integer> stack = new Stack<Integer>();
    static int count = 0;

    public static void main(String[] args) {

        int[] data = {1, 2, 3, 4};
        recursion2(data, 3, 0);
        System.out.println(count);
    }

    /**
     * 递归方法,当实际选取的数目与要求选取的数目相同时,跳出递归
     *
     * @param dataArray 数组
     * @param selectNum 要选取的数目
     * @param curNum    当前已经确定个数
     */
    public static void recursion2(int[] dataArray, int selectNum, int curNum) {

        if (curNum == selectNum) {
            count++;
            System.out.println(stack);
            return;
        }

        for (int item : dataArray) {
            if (!stack.contains(item)) {
                stack.push(item);
                recursion2(dataArray, selectNum, curNum + 1);
                stack.pop();
            }
        }
    }

}

运行结果:

四、组合问题

问题3:

从m个球里(编号为1,2,3...,m)一次取n个球,其中m>n,记录取出球的编号,不同的顺序是同一种组合,枚举所有的可能性。

分析:这是组合问题。因该有种可能性。

package xu.com.coder.test;

import java.util.Stack;

/**
 * @author xulijun
 */
public class Recursion3Test {

    static Stack<Integer> stack = new Stack<Integer>();
    static int count = 0;

    public static void main(String[] args) {

        int[] data = {1, 2, 3, 4};
        recursion3(data, 3, 0, 0);
        System.out.println(count);
    }

    /**
     * 递归方法,当实际选取的数目与要求选取的数目相同时,跳出递归
     *
     * @param dataArray 数组
     * @param selectNum 要选取的数目
     * @param curNum    当前已经确定的个数
     */
    public static void recursion3(int[] dataArray, int selectNum, int curNum, int indexNum) {

        if (curNum == selectNum) {
            count++;
            System.out.println(stack);
            return;
        }

        for (int i = indexNum; i < dataArray.length; i++) {
            if (!stack.contains(dataArray[i])) {
                stack.push(dataArray[i]);
                recursion3(dataArray, selectNum, curNum + 1, i);
                stack.pop();
            }
        }
    }

}

 运行结果:

补充说明: 

又的读者可能说,上面的代码太复杂看不懂,这里顺嘴提一个特别简单大家看的懂的办法;

1、比如从1、2、3、4中选2个作为一组组合

package xu.com.coder.test;

/**
 * @author xulijun
 */
public class Recursion3Test_1 {

    static int count = 0;

    public static void main(String[] args) {

        int[] data = {1, 2, 3, 4};
        recursion3(data, 3);
        System.out.println(count);

    }
    
    public static void recursion3(int[] dataArray, int selectNum) {

        for (int i = 0; i < dataArray.length; i++) {
            for (int j = i + 1; j < dataArray.length; j++) {
                count++;
                System.out.println("[" + dataArray[i] + "," + dataArray[j] + "]");
            }
        }
    }

}

2、比如从1、2、3、4中选3个作为一组组合

package xu.com.coder.test;

/**
 * @author xulijun
 */
public class Recursion3Test_1 {

    static int count = 0;

    public static void main(String[] args) {

        int[] data = {1, 2, 3, 4};
        recursion4(data, 3);
        System.out.println(count);

    }

    public static void recursion4(int[] dataArray, int selectNum) {

        for (int i = 0; i < dataArray.length; i++) {
            for (int j = i + 1; j < dataArray.length; j++) {
                for (int m = j + 1; m < dataArray.length; m++) {
                    count++;
                    System.out.println("[" + dataArray[i] + "," + dataArray[j] + "," + dataArray[m] + "]");
                }
            }
        }
    }


}

这个办法非常简单,应该一般人都能看得懂,但是最大的问题是我们必须要先知道从中选择几个,否则我们的循环层级是不确定的,但是考试时候可以用这个方法可以用来应急。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2282965.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PAT甲级-1020 Tree Traversals

题目 题目大意 给出一棵树的后序遍历和中序遍历&#xff0c;要求输出该树的层序遍历。 思路 非常典型的树的构建与遍历问题。后序遍历和中序遍历可以得出一个树的结构&#xff0c;用递归锁定根节点&#xff0c;然后再遍历左右子树&#xff0c;我之前发过类似题目的博客&…

GIS 中的 SQLAlchemy:空间数据与数据库之间的桥梁

利用 SQLAlchemy 在现代应用程序中无缝集成地理空间数据导言 地理信息系统&#xff08;GIS&#xff09;在管理城市规划、环境监测和导航系统等各种应用的空间数据方面发挥着至关重要的作用。虽然 PostGIS 或 SpatiaLite 等专业地理空间数据库在处理空间数据方面非常出色&#…

【AppleID】注册M区AppleID 2025年

注册&#xff08;一台电脑一天只能注册一个&#xff09; https://account.apple.com/ 需任意邮箱&#xff0c;任意手机 手机上登录后填地址 示例

frida的常用api

1、Hook普通方法、打印参数和修改返回值 Hook函数 Hook代码 function hookTest1(){var utils Java.use("com.zj.wuaipojie.Demo");utils.a.implementation function(str){// a "test";var retval this.a(str);console.log(str , retval);return retva…

基于C语言的数组从入门到精通

简介:本篇文章主要介绍了一维数组,二维数组,字符数组的定义,数组的应用,数组的核心代码解析,适用于0基础的初学者. C语言数组 1.一维数组 1.1定义 1.1.1声明 语法:数据类型 数组名[数组大小];示例:int arr[5]; 1.1.2初始化 a.静态初始化 完全初始化&#xff1a;int arr[5] {1…

【Elasticsearch】inference ingest pipeline

Elasticsearch 的 Ingest Pipeline 功能允许你在数据索引之前对其进行预处理。通过使用 Ingest Pipeline&#xff0c;你可以执行各种数据转换和富化操作&#xff0c;包括使用机器学习模型进行推理&#xff08;inference&#xff09;。这在处理词嵌入、情感分析、图像识别等场景…

【线性代数】基础版本的高斯消元法

[精确算法] 高斯消元法求线性方程组 线性方程组 考虑线性方程组&#xff0c; 已知 A ∈ R n , n , b ∈ R n A\in \mathbb{R}^{n,n},b\in \mathbb{R}^n A∈Rn,n,b∈Rn&#xff0c; 求未知 x ∈ R n x\in \mathbb{R}^n x∈Rn A 1 , 1 x 1 A 1 , 2 x 2 ⋯ A 1 , n x n b 1…

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…

算法每日双题精讲 —— 二分查找(山脉数组的峰顶索引,寻找峰值)

&#x1f31f;快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。 &#x1f31f; 别再犹豫了&#xff01;快来订阅我们的算法每日双题精讲专栏&#xff0c;一起踏上算法学习的精彩之旅吧&#x1f4aa; 在算法的…

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址 目录 html加载全部代码 方式一&#xff1a;使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式&#xff0c;设置type加载数据类型 设置线条 鼠标移入改变颜色&#xff0c;设置图层属性&#xff0c;此处是fill-extru…

衡量算法性能的量级标准:算法复杂度

今天开始数据结构的学习&#xff01;作为一大重点&#xff0c;拿出态度很重要&#xff0c;想要真实掌握&#xff0c;博客笔记自然少不了&#xff01;重点全部上色&#xff01;避免疏忽 下面我们从0基础开始学习今天的第一节&#xff01;不用担心看不懂&#xff0c;拒绝枯燥的理…

IDE提示:因为在此系统上禁止运行脚本。有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID=135170

问题情况 不知道为什么我的IDE终端运行命令的时候总提示以下内容&#xff1a; Import-Module : 无法加载文件 D:\Anaconda3\shell\condabin\Conda.psm1&#xff0c;因为在此系统上禁止运行脚本。有关详细信息&#xff0c;请参阅 https:/go.microsoft.com/fwlink/?LinkID1351…

DRF开发避坑指南01

在当今快速发展的Web开发领域&#xff0c;Django REST Framework&#xff08;DRF&#xff09;以其强大的功能和灵活性成为了众多开发者的首选。然而&#xff0c;错误的使用方法不仅会导致项目进度延误&#xff0c;还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…

GD32的GD库开发

所有的Cortex-M处理器都有相同的SysTick定时器&#xff0c;因为CMSIS-Core头文件中定义了一个名为SysTick的结构体。 这个定时器可以用作延时函数&#xff0c;不管是STM32的芯片还是GD32&#xff0c;AT32的芯片&#xff0c;delay函数都可以这么写&#xff0c;只要它是cortex-M…

LabVIEW项目中的工控机与普通电脑选择

工控机&#xff08;Industrial PC&#xff09;与普通电脑在硬件设计、性能要求、稳定性、环境适应性等方面存在显著差异。了解这些区别对于在LabVIEW项目中选择合适的硬件至关重要。下面将详细分析这两种设备的主要差异&#xff0c;并为LabVIEW项目中的选择提供指导。 ​ 硬件设…

python如何导出数据到excel文件

python导出数据到excel文件的方法&#xff1a; 1、调用Workbook()对象中的add_sheet()方法 wb xlwt.Workbook() ws wb.add_sheet(A Test Sheet) 2、通过add_sheet()方法中的write()函数将数据写入到excel中&#xff0c;然后使用save()函数保存excel文件 ws.write(0, 0, 1234…

Yocto项目 - 解读CROss PlatformS (CROPS)

一、概述 Yocto项目是一个用于创建自定义Linux发布版本的工具集成项目&#xff0c;在应对复杂应用场景时能提供高度可自定义性。但是在多端机应用中&#xff0c;如何在不同的平台上可靠地完成构建工作&#xff1f;CROss PlatformS (CROPS)即展示了其重要作用。 CROPS是Yocto项…

【技巧】优雅的使用 pnpm+Monorepo 单体仓库构建一个高效、灵活的多项目架构

单体仓库&#xff08;Monorepo&#xff09;搭建指南&#xff1a;从零开始 单体仓库&#xff08;Monorepo&#xff09;是一种将多个相关项目集中管理在一个仓库中的开发模式。它可以帮助开发者共享代码、统一配置&#xff0c;并简化依赖管理。本文将通过实际代码示例&#xff0…

Ubuntu24.04初始化MySQL报错 error while loading shared libraries libaio.so.1

Ubuntu24.04初始化MySQL报错 error while loading shared libraries: libaio.so.1 问题一&#xff1a;libaio1不存在 # 提示libaio1不存在 [rootzabbix-mysql-master.example.com x86_64-linux-gnu]#apt install numactl libaio1 Reading package lists... Done Building depe…

数据标注开源框架 Label Studio

数据标注开源框架 Label Studio Label Studio 是一个开源的、灵活的数据标注平台&#xff0c;旨在帮助开发者和数据科学家轻松创建高质量的训练数据集。它支持多种类型的数据&#xff08;如文本、图像、音频、视频等&#xff09;以及复杂的标注任务&#xff08;如分类、命名实体…