zoukankan      html  css  js  c++  java
  • 60.Permutation Sequence

    题目链接

    题目大意:找出n的全排列中的第k个排列。

    法一:DFS,遍历前k个排列,输出,超时。代码如下:

     1 public String getPermutation(int n, int k) {
     2         List<Integer> tmp = new ArrayList<Integer>();
     3         String res = "";
     4         List<List<Integer>> list = new ArrayList<List<Integer>>();
     5         res = dfs(list, n, k, tmp, res);
     6         return res;
     7     }
     8     public static String dfs(List<List<Integer>> list, int n, int k, List<Integer> tmp, String res) {
     9         if(list.size() > k) {
    10             return res;
    11         }
    12         if(tmp.size() == n) {
    13             list.add(new ArrayList<Integer>(tmp));
    14             if(list.size() == k) {
    15                 for(int i = 0; i < tmp.size(); i++) {
    16                     res += tmp.get(i);
    17                 }
    18             }
    19             return res;
    20         }
    21         for(int i = 1; i <= n; i++) {
    22             if(!tmp.contains(i)) {
    23                 tmp.add(i);
    24                 res = dfs(list, n, k, tmp, res);
    25                 tmp.remove(tmp.size() - 1);
    26             }
    27         }
    28         return res;
    29     }
    View Code

    法二(借鉴):数学规律,具体,代码如下(耗时17ms):

     1     public String getPermutation(int n, int k) {
     2         List<Integer> num = new LinkedList<Integer>();
     3         for(int i = 1; i <= n; i++) {
     4             num.add(i);
     5         }
     6         int[] fact = new int[n];
     7         fact[0] = 1;
     8         //计算阶层
     9         for(int i = 1; i < n; i++) {
    10             fact[i] = i * fact[i - 1];
    11         }
    12         k = k - 1;
    13         //由于要经常+字符串,所以弃用String,这样可以加快效率
    14         StringBuilder res = new StringBuilder();
    15         for(int i = n; i > 0; i--) {
    16             //第i位应该放置的第pos个数,这个pos是原1-n中的位置
    17             int pos = k / fact[i - 1];
    18             k = k % fact[i - 1];
    19             //正确放置
    20             res.append(num.get(pos));
    21             //已经放置过了就删除
    22             num.remove(pos);
    23         }
    24         return res.toString();
    25     }
    View Code
  • 相关阅读:
    Form组件
    LAMP+Varnish的实现
    缓存反向代理-Varnish
    CDN初识
    HTTP缓存初探
    Keepalived搭建主从架构、主主架构实例
    实现高可用-Keepalived
    nginx负载均衡实例
    lvs集群实现lvs-dr模型和lvs-nat模型
    LVS介绍
  • 原文地址:https://www.cnblogs.com/cing/p/9115913.html
Copyright © 2011-2022 走看看