欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 名人名企 > 【番外篇】排列组合实现算法2(Java版)

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

2025/4/23 2:38:31 来源:https://blog.csdn.net/u013521220/article/details/145305720  浏览:    关键词:【番外篇】排列组合实现算法2(Java版)

一、说明

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

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

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

二、放回再取问题

1、问题1:

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

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

package xu.com.coder.test;import java.util.Stack;public class Recursion1Test {static Stack<Integer> stack = new Stack<Integer>();static int cnt = 0;public static void main(String[] args) {int[] data = {1, 2, 3, 4};recursion(data, 0, 3);System.out.println(cnt);}/*** 递归方法,当实际选取的数目与要求选取的小目相同时,跳出递归** @param array  - 数组* @param curnum - 当前已经确定的个数* @param maxnum - 要选取的数目*/public static void recursion(int[] array, int curnum, int maxnum) {if (curnum == maxnum) {cnt++;System.out.println(stack);return;}for (int item : array) {stack.push(item);recursion(array, curnum + 1, maxnum);stack.pop();}}}

运行结果:

 三、排列问题

问题2:        

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

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

package xu.com.coder.test;import java.util.Stack;public class Recursion2Test {static Stack<Integer> stack = new Stack<Integer>();static int cnt = 0;public static void main(String[] args) {int[] data = {1, 2, 3, 4};recursion2(data, 0, 3);System.out.println(cnt);}public static void recursion2(int[] array, int curnum, int maxnum) {if (curnum == maxnum) {cnt++;System.out.println(stack);return;}for (int item : array) {if (!stack.contains(item)) {stack.push(item);recursion2(array, curnum + 1, maxnum);stack.pop();}}}}

运行结果:

四、组合问题

问题3:

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

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

package xu.com.coder.test;import java.util.Stack;public class Recursion3Test {static Stack<Integer> stack = new Stack<Integer>();static int cnt = 0;public static void main(String[] args) {int[] data = {1, 2, 3, 4};recursion3(data, 0, 3, 0);System.out.println(cnt);}public static void recursion3(int[] array, int curnum, int maxnum, int indexnum) {if (curnum == maxnum) {cnt++;System.out.println(stack);return;}for (int i = indexnum; i < array.length; i++) {if (!stack.contains(array[i])) {stack.push(array[i]);recursion3(array, curnum + 1, maxnum, i);stack.pop();}}}}

 运行结果:

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词