递归之排列问题
来源:互联网 发布:尤克里里新手入门软件 编辑:程序博客网 时间:2024/06/05 07:48
问题描述:
给定一个数组,求数组元素的排列问题
算法思路:
采用递归的思想,设定集合R={r1,r2,r3,r4},Ri=R-ri,集合R中的元素的全排列记为P(R)
首先我们分为两种情况,R集合中只有一个元素和R集合中有多个元素
情况1:R集合中只有一个元素,这时集合R的全排列就只有一个
情况2:R集合中有多个元素,这时我们可以递归的进行求解。
举例说明:
集合R中有两个元素时:全排列为以r1开头的全排列加上以r2开头的全排列,这时只有{r1,r2}和{r2,r1}
集合R中有三个元素时:全排列为以r1开头的全排列加上以r2开头的全排列加上以r3开头的全排列,以r1开头的全排列进行分析,由于首位已经固定,所以我们可以直接考虑剩余元素{r2,r3}的全排列,然后在他们的全排列前加上r1就可以;求解{r2,r3}的全排列就可以参考集合中有两个元素时的情况,这样就可以将所有的情况递归的求解出来。
集合R中有四个元素时:同理,先分解为三个,然后两个,然后一个……
代码
public static void getPermutation(int[] array,int i,int n){ if(i==n){ for(int j=0;j<=n;j++){ System.out.print(array[j]+" "); } System.out.println(); }else{ for(int j=i;j<=n;j++){ int temp=array[i]; array[i]=array[j]; array[j]=temp; getPermutation(array, i+1, n); temp=array[i]; array[i]=array[j]; array[j]=temp; } } }
运行结果
反思
通过结果我们可以发现当数组中没有重复元素时,结果是对的,但是当数组中出现了重复元素时,结果就不正确,出现了很多重复的结果。这时候,我们可以利用set集合的元素不能重复的特性,先将结果保存在set中,然后在打印set中排列的结果。修改后的代码如下:
public static void getPermutation(int[] array,int i,int n){ if(i==n){ StringBuffer s=new StringBuffer(); for(int j=0;j<=n;j++){ s.append(array[j]+" "); } set.add(s.toString()); }else{ for(int j=i;j<=n;j++){ int temp=array[i]; array[i]=array[j]; array[j]=temp; getPermutation(array, i+1, n); temp=array[i]; array[i]=array[j]; array[j]=temp; } } }
然后在main函数中直接输出
System.out.println(Arrays.toString(set.toArray()));
运行结果如下
阅读全文
0 0
- 递归之排列问题
- 递归算法之排列问题
- 全排列问题之递归求解
- 全排列问题之递归求解
- 递归算法之排列问题解读
- 递归算法之全排列问题
- 递归和分治策略之排列问题
- 递归求排列问题
- 递归 全排列 问题
- 递归-排列问题
- 排列问题(递归)
- 递归---排列问题
- 递归-排列问题
- 递归之整数划分问题和排列问题
- 递归之全排列
- 递归之全排列
- 递归之全排列
- 递归分治算法之全排列问题(Java版本)
- 3将命令添加到工具栏
- yum 软件仓库的使用
- Android 异常错误积累
- librtmp协议分析---RTMP_SendPacket函数
- 使用Ant构建java项目
- 递归之排列问题
- AndroidStudio的编码问题
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06)
- 视频的读取、播放、保存
- 微信服务号生成带参数二维码
- PHP时间相减获得剩余天数小时数分钟数
- Tomcat启动时在Initializing Spring FrameworkServlet 'springServlet'卡住不动
- cdh5配置hbase权限
- linux下的项目建立