60. 第k個排列
給出集合 [1,2,3,…,n],其所有元素共有 n! 種排列。
按大小順序列出所有排列情況,並一一標記,當 n = 3 時, 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n 和 k,返回第 k 個排列。
說明:給定 n 的範圍是 [1, 9]。
給定 k 的範圍是[1, n!]。
示例 1:
輸入: n = 3, k = 3
輸出: "213"
示例 2:
輸入: n = 4, k = 9
輸出: "2314"
第一想法是修改一下46. 全排列**,加個計數器數到第k個就返回,雖然能過,但是時間效率很差。
那麼這裡其實可以加剪枝,並不需要都遍歷到葉子節點,很多都是可以跳過的,以n = 4, k = 9
為例,第一層,以1開頭,後面有3個數「2、3、4」可選,以1開頭的全排列一共有3!=6
個,並且6**寫得有點醜不管了。。
int k;
string ans;
public
static
void
main
(string[
] args)
public string getpermutation
(int n,
int k)
private
void
permutation
(int n, string str,
boolean
visited)
return;}
int ps =
factorial
(n-1
-str.
length()
);for(
int i =
1;i<=n;i++
) visited[i]
=true
;permutation
(n, str+string.
valueof
(i), visited)
; visited[i]
=false;if
(ans!=null)
return;}
}private
intfactorial
(int n)
return res;
}
LeetCode60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 示例 1 輸入 n 3,k 3輸出 213 示例 2 輸入 n 4,k 9輸出 23...
leetcode 60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...
LeetCode 60 第k個排列
給出集合 1,2,3,n 其所有元素共有 n 種排列。按大小順序列出所有排列情況,並一一標記,當 n 3 時,所有排列如下 123 132 213 231 312 321 給定 n 和 k,返回第 k 個排列。說明 給定 n 的範圍是 1,9 給定 k 的範圍是 1,n 示例 1 輸入 n 3,k ...