每日算法之四十二:Permutation Sequence (顺序排列第k个序列)

The 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-1)!个序列,因此n个数字所以共有n!个序列。

以此类推,第二位每一个数开头都有(n-2)!个序列。

因为数字不能重复,我用sign记录数字是否使用过,data存阶层的值。

每次循环找到没使用过的数中第k/data[i]个数就是当前位的数字。(这就是中间带有break的循环的原因)

对于这种不好确定次序的情况,应该举例说明,这样就能很清楚的看明白是否应该多加一个或者少减一个。

class Solution {
public:
    string getPermutation(int n, int k) {
        int data[10];
        vector<bool> visited(10,0);
        data[0]=1;
        for(int i=1;i<=n;i++)
        {
            data[i]=data[i-1]*i;
        }
        string str(n,'0');
        --k;            //从0位开始算起,例如,从1开始算的第5个,也就是从0开始算的第四个
        for(int i=n-1;i>=0;i--)
        {
            int temp_k=k/data[i];
            int j=1;
            for(;j<10;j++)
            {
                if(visited[j]==0)
                    temp_k--;
                if(temp_k<0)
                    break;
            }
            visited[j]=1;
            str[n-i-1]='0'+j;
            k=k%data[i];
        }
        return str;
    }
};

每日算法之四十二:Permutation Sequence (顺序排列第k个序列),布布扣,bubuko.com

时间: 2024-12-20 10:31:18

每日算法之四十二:Permutation Sequence (顺序排列第k个序列)的相关文章

每日算法之四十:Insert Interval

Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessary). You may assume that the intervals were initially sorted according to their start times. Example 1: Given intervals [1,3],[6,9], insert and merge 

每日算法之四十六:Add Binary(二进制字符创相加)

二进制字符创相加,通过进位的方式逐位考虑.也可以把相加的过程抽象成一个函数. Given two binary strings, return their sum (also a binary string). For example, a = "11" b = "1" Return "100". 方法一: class Solution { public: string addBinary(string a, string b) { int a_

每日算法之四十四:Unique Path(矩阵中不重复路径的数目)

Unique Paths: A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked

每日算法之四十八:Plus One (数组表示的十进制加一进位)以及求Sqrt(x)

给定数组表示的十进制数,加一操作.结果依然用十进制的数组表示.这里主要注意最高位(digit[0])依然有进位,即溢出的情况. Given a non-negative number represented as an array of digits, plus one to the number. The digits are stored such that the most significant digit is at the head of the list. <span style=

经典算法题每日演练——第二十二题 奇偶排序

原文:经典算法题每日演练--第二十二题 奇偶排序 这个专题因为各种原因好久没有继续下去了,MM吧...你懂的,嘿嘿,不过还得继续写下去,好长时间不写,有些东西有点生疏了, 这篇就从简单一点的一个“奇偶排序”说起吧,不过这个排序还是蛮有意思的,严格来说复杂度是O(N2),不过在多核的情况下,可以做到 N2 /(m/2)的效率,这里的m就是待排序的个数,当m=100,复杂度为N2 /50,还行把,比冒泡要好点,因为重点是解决问题的奇思妙想. 下面我们看看这个算法是怎么描述的,既然是奇偶,肯定跟位数有

经典算法题每日演练——第十二题 线段树

原文:经典算法题每日演练--第十二题 线段树 这一篇我们来看树状数组的加强版线段树,树状数组能玩的线段树一样可以玩,而且能玩的更好,他们在区间求和,最大,平均 等经典的RMQ问题上有着对数时间的优越表现. 一:线段树 线段树又称"区间树”,在每个节点上保存一个区间,当然区间的划分采用折半的思想,叶子节点只保存一个值,也叫单元节点,所 以最终的构造就是一个平衡的二叉树,拥有CURD的O(lgN)的时间. 从图中我们可以清楚的看到[0-10]被划分成线段的在树中的分布情况,针对区间[0-N],最多有

每日算法之三十五:Wildcard Matching

模式匹配的实现,'?'代表单一字符,'*'代表任意多的字符,写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for '?' and '*'.. '?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence). The matching should cover the en

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先

42. 蛤蟆的数据结构笔记之四十二图的遍历之广度优先 本篇名言:"生活真象这杯浓酒 ,不经三番五次的提炼呵 , 就不会这样一来可口 ! -- 郭小川" 继续看下广度优先的遍历,上篇我们看了深度遍历是每次一个节点的链表是走到底的. 欢迎转载,转载请标明出处:http://write.blog.csdn.net/postedit/47029275 1.  原理 首先,从图的某个顶点v0出发,访问了v0之后,依次访问与v0相邻的未被访问的顶点,然后分别从这些顶点出发,广度优先遍历,直至所有的

每日算法之四十三:Rotate List (列表旋转k个元素)

Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given 1->2->3->4->5->NULL and k = 2, return 4->5->1->2->3->NULL. 这里的k可能是比链表长度要大的数字,因此实际旋转的位置就是k%len(list).如果这个计算结果等于零或者等于len(list),