全排列及应用

一般来说全排列用于数字排序问题,比如求1,2,3,5,6,7这几个数字组成的比123567大的第一个数,也就是123576,这时候可以用全排列来做,所有的可能都排一下,然后找大于123567的最小数,就是我们要求的了。时间复杂度就是O(n!)。当然这个题有别的做法,时间复杂度是O(n);有需要的可以找我,过两天再写。逻辑上也不复杂。

再比如阿里巴巴最近的一道题:输入6个0-9的数字,找出来能组合的最大时间,最小时间,如果不存在就输出N/A。比如123456,最大时间就是:23:56:41,最小时间就是12:34:56。首先全排列一下,然后先判断每个是否符合时间格式要求。然后设置最大的为00:00:00,最小的为:23:59:59,接下来去比较就好了,也没必要换算成秒去比,直接用字符串比较就Ok了。

我们可以看到全排列在这时候方法简单粗暴,但是比如另一种:1,2,2,3,4,如果排列有多少种不同的序列,这里考虑到有两个2,所以首先就是要排序,接下来就是中间细节处理了,有空我码代码试试。

全排列代码如下:

  1. public class permutate {  
  2.     public static int total = 0;  
  3.     public static void swap(String[] str, int i, int j)  
  4.     {  
  5.         String temp = new String();  
  6.         temp = str[i];  
  7.         str[i] = str[j];  
  8.         str[j] = temp;  
  9.     }  
  10.     public static void arrange (String[] str, int st, int len)  
  11.     {  
  12.         if (st == len - 1)  
  13.         {  
  14.             for (int i = 0; i < len; i ++)  
  15.             {  
  16.                 System.out.print(str[i]+ "  ");  
  17.             }  
  18.             System.out.println();  
  19.             total++;  
  20.         }  
  21.         else  
  22.         {  
  23.             for (int i = st; i < len; i ++)  
  24.             {  
  25.                 swap(str, st, i);  
  26.                 arrange(str, st + 1, len);  
  27.                 swap(str, st, i);  
  28.             }  
  29.         }     
  30.     }  
  31.     public static void main(String[] args) {  
  32.          String str[] = {"a","b","c"};  
  33.          arrange(str, 0, str.length);  
  34.          System.out.println(total);  
  35.     }  
  36. }  


猜你喜欢

转载自blog.csdn.net/mad_sword/article/details/79634093