cubegao

Swift.最小的K个数

2016-02-12

题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import Foundation

class For30Solution {
func topK(_ n: [Int],_ minK: Int) -> [Int] {

if n.count == 0 || minK == 0 {
return []
}

var nums = n
var start = 0
var end = n.count - 1
var index = partition(&nums, start, end)
while index != minK - 1 {
if index > minK - 1 {
end = index - 1
index = partition(&nums, start, end)
}

if index < minK - 1 {
start = index + 1
index = partition(&nums, start, end)
}
}

return Array(nums[0..<minK])
}


//快排partition
func partition(_ n: inout [Int],_ leftIn: Int,_ rightIn: Int ) -> Int {
let temp = n[leftIn]
var left = leftIn
var right = rightIn

while left < right {
while left < right && n[right] >= temp {
right -= 1
}
n[left] = n[right]

while left < right && n[left] <= temp {
left += 1
}
n[right] = n[left]
}

n[left] = temp

return left
}
}

算法思想:利用快速排序划分的思想,每一次划分就会有一个数字位于以数组从小到达排列的的最终位置index;最后index=K就完成了。

github地址:https://github.com/cubegao/LeetCode

扫描二维码,分享此文章