给定一个数组,求出数组元素的排列和组合——Java实现
来源:互联网 发布:军娘捏脸数据 编辑:程序博客网 时间:2024/06/06 02:59
1. 思路
组合数C(n,m)和全排列A(n,n)可以通过递归的方式,直接实现。
而A(n,m)则可以通过组合数和全排列间接求出A(n,m)=C(n,m)*A(m,m),即对得到的组合数中的每个元素进行全排列
2. Java实现
package com.zfy.test3;import java.util.*;public class PC {public static void main(String[] args){char[] str={'A','B','C','D','E'};ArrayList<Character> t=new ArrayList<Character>();ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>();//求组合数Combination(str,5,3,t,res);System.out.println(res);//求全排列System.out.println(Permutation(str,5,3));}//全排列方法1public static void permulation(int[] list, int start, int length) { int i; if (start == length) { for (i = 0; i < length; i++) System.out.print(list[i] + " "); System.out.println(); } else { for (i = start; i < length; i++) { swap(list, start, i); permulation(list, start + 1, length); swap(list, start, i); } } } public static void swap(int[] list, int start, int i) { int temp; temp = list[start]; list[start] = list[i]; list[i] = temp; } //全排列方法2 public static ArrayList<ArrayList<Character>> Permutation(char[] A,int n){if(n==1){ArrayList<Character> t=new ArrayList<Character>();ArrayList<ArrayList<Character>> temp=new ArrayList<ArrayList<Character>>();t.add(A[0]);temp.add(t);return temp;}else{ArrayList<ArrayList<Character>> temp=Permutation(A,n-1);ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>();for(int i=0;i<temp.size();i++){for(int j=0;j<n;j++){ArrayList<Character> t=new ArrayList<Character>(temp.get(i));if(j<n-1){t.add(j,A[n-1]);res.add(t);}else{t.add(A[n-1]);res.add(t);}}}return res;}} //指定个数元素的排列 public static ArrayList<ArrayList<Character>> Permutation(char[] A,int n,int m) { ArrayList<ArrayList<Character>> temp=new ArrayList<ArrayList<Character>>(); ArrayList<Character> t=new ArrayList<Character>(); Combination(A,n,m,t,temp); ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>(); for(int i=0;i<temp.size();i++) { char[] tc=new char[temp.get(i).size()]; for(int j=0;j<tc.length;j++) { tc[j]=temp.get(i).get(j); } res.addAll(Permutation(tc,tc.length)); } return res; }//组合数,通过参数返回结果public static void Combination(char[] A,int n,int m,ArrayList<Character> t,ArrayList<ArrayList<Character>> res){if(m==0){ArrayList<Character> temp=new ArrayList<Character>(t);res.add(temp);}else{//for(int i=n-1;i>=m-1;i--)//{//t.add(A[i]);//Combination(A,i,m-1,t,res);//t.remove(t.size()-1);//}for(int i=A.length-n;i<=A.length-m;i++){t.add(A[i]);Combination(A,A.length-i-1,m-1,t,res);t.remove(t.size()-1);}}}//组合数,通过返回值返回结果public static ArrayList<ArrayList<Character>> Combination(char[] A,int n,int m,ArrayList<Character> t){ArrayList<ArrayList<Character>> res=new ArrayList<ArrayList<Character>>();if(m==0){ArrayList<Character> temp=new ArrayList<Character>(t);res.add(temp);return res;}else{//for(int i=n-1;i>=m-1;i--)//{//t.add(A[i]);//Combination(A,i,m-1,t,res);//t.remove(t.size()-1);//}for(int i=A.length-n;i<=A.length-m;i++){t.add(A[i]);res.addAll(Combination(A,A.length-i-1,m-1,t));t.remove(t.size()-1);}return res;}}}
0 0
- 给定一个数组,求出数组元素的排列和组合——Java实现
- 求出数组中满足给定和的所有元素组合
- (lodash_gcy)union—将给定的几个数组的唯一元素组合成一个数组
- Java实现——查找数组中连续元素的和等于给定数的子数组
- 给定一个整形数组(10个元素)求出最大值。
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 给定一个数组,求数组中所有元素的可能组合(每个元素只出现一次),使其和等于给定数的解决办法
- 阿里——给一个整形数组,找出其中和等于给定值的组合
- 用指针数组处理一个二维数组,求出二维数组所有元素的和。
- Java实现——数组元素全排列
- 在数组中求出两个数,使他们的和等于给定的一个数
- 给定一个数组,求数组的全排列
- 用JAVA编写一个算法实现对一个字符数组的所有元素的所有组合
- 算法.给定数为数组中2个元素的之和,求出数组的下标
- 给定一个正整数数组,找所有元素组合起来最大的值(答案)
- 1. Two Sum 给定一个数组和一个数,输出两个和为给定数的数组元素的下标
- 【Java】给定一个有序整数数组,元素各不相同且按照升序排列,编写一个算法,创建一个高度最小的二叉查找树
- 一个能将给定非负整数数组中的数字排列成最大数字的函数(数组元素长度随机)
- 第八届蓝桥杯最大公共子串
- Ubuntu下安装Eclipse完整教程
- Assign Cookies
- part-12 输入电容Cin的测量
- vsftpd与PAM模块编译、安装及测试流程
- 给定一个数组,求出数组元素的排列和组合——Java实现
- part-13 轨至轨输入(Rail to Rail)
- 死锁
- 三维扫描仪[11]——总结并展望基于Kinect的三维扫描仪
- 简单的文件上传(javaweb实现)
- Eclipse中安装插件
- Java final关键字有哪些用法 (主要问你内部类形参为什么用final修饰)
- MySQL的存储过程
- Windows10 TensorFlow “Couldn't open CUDA library cudnn64_5.dll”