前言
我們社區(qū)陸續(xù)會(huì)將顧毅(Netflix 增長(zhǎng)黑客不瓶,《iOS 面試之道》作者,ACE 職業(yè)健身教練灾杰。微博:@故胤道長(zhǎng))的 Swift 算法題題解整理為文字版以方便大家學(xué)習(xí)與閱讀蚊丐。
LeetCode 算法到目前我們已經(jīng)更新了 59 期,我們會(huì)保持更新時(shí)間和進(jìn)度(周一艳吠、周三麦备、周五早上 9:00 發(fā)布),每期的內(nèi)容不多昭娩,我們希望大家可以在上班路上閱讀泥兰,長(zhǎng)久積累會(huì)有很大提升。
不積跬步题禀,無(wú)以至千里鞋诗;不積小流,無(wú)以成江海迈嘹,Swift社區(qū) 伴你前行削彬。如果大家有建議和意見(jiàn)歡迎在文末留言全庸,我們會(huì)盡力滿(mǎn)足大家的需求。
難度水平:困難
1. 描述
給出集合 [1,2,3,...,n]
融痛,其所有元素共有 n!
種排列壶笼。
按大小順序列出所有排列情況,并一一標(biāo)記雁刷,當(dāng) n = 3
時(shí), 所有排列如下:
"123"
"132"
"213"
"231"
"312"
"321"
給定 n
和 k
覆劈,返回第 k
個(gè)排列。
2. 示例
示例 1
輸入:n = 3, k = 3
輸出:"213"
示例 2
輸入:n = 4, k = 9
輸出:"2314"
示例 3
輸入:n = 3, k = 1
輸出:"123"
約束條件:
1 <= n <= 9
1 <= k <= n!
3. 答案
class PermutationSequence {
func getPermutation(_ n: Int, _ k: Int) -> String {
var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9]
var factorial = 1
for i in 1 ..< n {
factorial *= i
}
var result = ""
var k = k
var divisor = n - 1
for i in 0 ..< n {
for (index, number) in numbers.enumerated() {
if k > factorial {
k -= factorial
} else {
result += "\(number)"
numbers.remove(at: index)
break
}
}
if divisor > 1 {
factorial /= divisor
divisor -= 1
}
}
return result
}
}
- 主要思想:迭代并將數(shù)組從最后一個(gè)更改為第一個(gè)沛励。
- 時(shí)間復(fù)雜度: O(n^2)
- 空間復(fù)雜度: O(1)
該算法題解的倉(cāng)庫(kù):LeetCode-Swift
點(diǎn)擊前往 LeetCode 練習(xí)
關(guān)于我們
我們是由 Swift 愛(ài)好者共同維護(hù)责语,我們會(huì)分享以 Swift 實(shí)戰(zhàn)、SwiftUI目派、Swift 基礎(chǔ)為核心的技術(shù)內(nèi)容坤候,也整理收集優(yōu)秀的學(xué)習(xí)資料。
后續(xù)還會(huì)翻譯大量資料到我們公眾號(hào)企蹭,有感興趣的朋友白筹,可以加入我們。