排列组合的实现Cmn,Amn

递归方法:

public class Combination {

    /**
     * 计算从m个元素中选n个元素的组合数Cmn
     * @param m 总共有m个元素
     * @param n 从中选n个元素
     * @return 组合数Cmn的值
     */
    public static int Cmn(int m, int n) {
        if (n == 0 || n == m) {
            return 1;
        } else {
            // 两者可能,一个是选了n中的一个元素此时是Cmn(m-1, n-1),另一个是没选n中元素是Cmn(m-1, n)。
            return Cmn(m-1, n-1) + Cmn(m-1, n);
        }
    }

    /**
     * 计算从m个元素中选n个元素的排列数Amn
     * @param m 总共有m个元素
     * @param n 从中选n个元素
     * @return 排列数Amn的值
     */
    public static int Amn(int m, int n) {
        if (n > m) {
            return 0; // 选的元素个数大于总共的元素个数,无法排列,返回0
        } else if (n == 0) {
            return 1; // 选的元素个数为0,只有一种排列方式
        } else {
            return m * Amn(m-1, n-1);
        }
    }
}

非递归方法(自己手动实现模仿计算方式):
注意:再调用这个函数之前,用Cmn注意将N选比较小的。不然数据容易溢出()具体看后续例题

public static int myCmn(int m, int n) {
        if (n>m){
            return 0;
        }
        long res = 1;
        for (int i = m; i > m-n; i--) {
            res=res*i;
        }
        for (int i = 1; i <= n; i++) {
            res=res/i;
        }
        return (int)res;
    }


    public static int myAmn(int m, int n) {
        if (n>m){
            return 0;
        }
        int res = 1;
        for (int i = m; i > m-n; i--) {
            res=res*i;
        }

        return res;
    }

剑指 Offer II 098. 路径的数目

class Solution {
    public int uniquePaths(int m, int n) {
        int sum = m-1+n-1;
        int downStep = m > n?n-1:m-1;
        return Cmn(sum,downStep);
    }

    public int Cmn(int m, int n) {
        if (m < n) {
            return 0;
        }
        long res = 1;
        for (int i = m, j = 1; j <= n; i--, j++) {
            res *= i;
            res /= j;
        }
        return (int) res;
    }
}

作者:静默虚空
欢迎任何形式的转载,但请务必注明出处。
限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

posted @   Chenyi_li  阅读(188)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示