【LeetCode】60. Permutation Sequence

栏目: 编程工具 · 发布时间: 7年前

内容简介:【LeetCode】60. Permutation Sequence

问题描述

https://leetcode.com/problems/permutation-sequence/#/description

he set [1,2,3,…,n] contains a total of n! unique permutations.

By listing and labeling all of the permutations in order,

We get the following sequence (ie, for n = 3 ):

  1. "123"
  2. "132"
  3. "213"
  4. "231"
  5. "312"
  6. "321"

Given n and k , return the kth permutation sequence.

Note: Given n will be between 1 and 9 inclusive.

求n个数字组成的所有全排列字符串中的第k个字符串。

算法

因为只要求 1 个,所以可以按照全排列的规则,一个个数的求出每个位置的数字,而不需要将所有的全排列字符串列出来。

对于 n 个字符组成的字符串 {1,2,3,...,n} ,取第 k 个数时,首先可以求出第一个数,即 (k-1)/(n-1个数的排列个数)

比如 n=3,k=4 时,全排列组合为:

  1. 1 + {2,3} 的全排列
  2. 2 + {1,3} 的全排列
  3. 3 + {1,2} 的全排列

我们可以首先求出目标 排序 的第一个数字,即 (k-1)/(两个数的排列数) = (k-1)/2 = 3/2 = 1 ,下标从 0 开始,下标 1 表示的数就是 2

接下来,就是求出 {1,3} 全排列中排在第 k-2=2 个位置上的数,方法同 3 个字母时一样,求出结果后为 231

所以,可以一层一层的求出第 k 个顺序的字符串。

时间复杂度为 O(N)

一开始是以递归形式写的算法,相对容易理解,但速度慢,所以又写了循环版本的。

代码

循环版本

public String getPermutation(int n, int k) {  
            char[] nums = new char[]{'1','2','3','4','5','6','7','8','9'};
            String tmp = "";
            for(int i=0;i<n;i++) {
                tmp += nums[i];
            }
            StringBuffer s = new StringBuffer(tmp);
            String r = "";
            while(k>0&&!s.toString().equals("")) {
                // 计算 (n-1)的排列个数cnt
                int cnt = 1, i = s.length()-1;
                while(i > 1) {
                    cnt*=i;
                    i-=1;
                }
                int pos = (k-1)/cnt;
                r += s.charAt(pos);
                s = s.deleteCharAt(pos);
                k -= pos * cnt;
            }
            return r;
        }

递归版本

public String getPermutation1(int n, int k) {
            char[] nums = new char[]{'1','2','3','4','5','6','7','8','9'};
            String s = "";
            for(int i=0;i<n;i++) {
                s += nums[i];
            }
            return fun(new StringBuffer(s), k);
        }

        public String fun(StringBuffer s, int k) {
            if(k<0 || s.toString().equals("")) return "";
            int cnt = 1, tmp = s.length()-1;
            while(tmp > 1) {
                cnt*=tmp;
                tmp-=1;
            }
            int pos = (k-1)/cnt;
            return s.charAt(pos) + fun(s.deleteCharAt(pos), k - pos*cnt);
        }

LeetCode解题代码仓库: https://github.com/zgljl2012/leetcode-java

我的微信公众号
【LeetCode】60. Permutation Sequence 转载请注明出处

http://www.zgljl2012.com/leetcode-60-permutation-sequence/


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

创业者

创业者

[美] 杰西卡·利文斯顿 / 夏吉敏 / 机械工业出版社 / 2010-5 / 58.00元

本书源自作者对32个IT行业创业者的访谈,包括Apple, Gmail, hotmail, TiVo, Flickr, Lotus 及 Yahoo公司等著名公司,主题为创业初期的人和事。 对于做梦都想创业的人来说,这本书一定要读,可以看看前辈高人是如何创业的。 对于希望了解企业家成功历程和经验的人来说,这是一本必读之书,因为里面有很多成功人士年轻时的故事,你可以好象看着他们长大一样,知......一起来看看 《创业者》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具