[LeetCode#60]Permutation Sequence
2015-08-21 06:10
507 查看
Problem:
The set
By listing and labeling all of the permutations in order,
We get the following sequence (ie, for n = 3):
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
Analysis:
Solution:
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):
"123"
"132"
"213"
"231"
"312"
"321"
Given n and k, return the kth permutation sequence.
Note: Given n will be between 1 and 9 inclusive.
Analysis:
Once you understand the mathematical principle behind this problem, the idea could be very easy. To successfully implement out the solution, you must equip good programming skills. Basic idea: According to the example, the small number should be placed before large number at first. which means: For num1 (num2 ... num9), There should be permutations among range (num2 ... num9), before we change num1. Apparently there are 8! permutations in the range(num2 ... num9). This is the same for every num in the combination. By taking advantage of this truth, we could calcualte the index for each position. Suppose k start from 0. index[0] = k/(n - 1)! index[1] = k'/(n - 2)! Note: k' = k % (n - 1) Skill 1. To use divide and mod operation, we make k start from 0. Benefit: the calculated index could be directly used for locating numbers. k--; 2. Use ArrayList for recording the available nums. (This method is very elegant! By taking the self adjustment property of the ArrayList, we no longer need to record which num was already used or not.) for (int i = 1; i <= n; i++) { num.add(i); } ... while (round >= 0) { int index = k / factorial; k %= factorial; ret.append(num.get(index)); num.remove(index); if (round > 0) factorial /= round; round --; } Note: index = k / factorial; The index must in the range of [0, round] when enter the while. Cause: k %= factorial; <factorial is (round+1)> the k is in the range of [(round-1)!, (round)!] 3. Get initial factorial, adjust it along the loop. a. get (n-1)! for (int i = 2; i <= n - 1; i++) { factorial *= i; } b. adjust it for next round. if (round > 0) factorial /= round; round --; c. get current index, and prepare k for getting next index int index = k / factorial; k %= factorial; This problem is not hard, but the programming skills it requires are not easy. Time complexity: Apparently, we need to computate the index for n factorial from (n to 1). For each computation, there is a append and remove operation. the remove operation would take O(n), thus the total time complexity is O(n^2).
Solution:
public class Solution { public String getPermutation(int n, int k) { if (n <= 0 || n > 9) return ""; k--; StringBuffer ret = new StringBuffer(); ArrayList<Integer> num = new ArrayList<Integer> (); int factorial = 1; for (int i = 1; i <= n; i++) { num.add(i); } for (int i = 2; i <= n - 1; i++) { factorial *= i; } int round = n - 1; while (round >= 0) { int index = k / factorial; k %= factorial; ret.append(num.get(index)); num.remove(index); //avoid the case at last round if (round > 0) factorial /= round; round --; } return ret.toString(); } }
相关文章推荐
- [Amazon]Given 2 numbers. Find if they are consecutive gray (grey) code sequences
- HUST team contest #2 C Divisible Subsequences ||poj 3844 (剩余类)
- iOS 笔记二:Multiple MVCs 、UINavigationController 、UITabBarController
- iOS实时检测UITextField内容
- DB Query Analyzer 6.04 is distributed, 78 articles concerned have been published
- Continue Posting, Keep Fighting
- iOS UI基础-3.0图片浏览器及plist使用
- String,StringBuffer与StringBuilder的区别?
- UVa 11085 - Back to the 8-Queens
- 解决duilib水平布局(HorizontalLayout)中控件位置计算错误的问题
- hdu 2064 Queuing (递推)
- break & continue
- ui学习总结第三天总结
- [LeetCode] Permutation Sequence
- LightOJ Array Queries 1082【线段树求区间最值】
- iOS_8_API:UIVisualEffectView (毛玻璃效果)
- ural Penguin-Avia
- Light OJ 1082 1082 - Array Queries(区间最值)
- 02-线性结构4. Pop Sequence (25)
- leetcode先刷_Unique Binary Search Trees II