收藏:①极市开发DeepLearning ②Git使用

面试常见算法题目

1 TOP K

 1 """35 最小的k个数
 2 TOPK问题: 一般建立大根堆,  如果是最大的就建立小根堆
 3 快排也可以实现
 4 """
 5 # 快排
 6 def p( L, l, r):
 7     temp, i = L[r], l - 1
 8     for j in range(l, r):
 9         if L[j] <= temp:
10             i += 1
11             L[i], L[j] = L[j], L[i]
12     L[i + 1], L[r] = L[r], L[i + 1]
13     return i + 1
14 
15 def GetLeastNumbers_Solution( tinput, k):
16     if k == 0 or k > len(tinput):
17         return []
18     else:
19         flag = p(tinput, 0, len(tinput) - 1)  #拆分点
20         while flag != k - 1:
21             if flag > k - 1:
22                 flag = p(tinput, 0, flag - 1)
23             if flag < k - 1:
24                 flag = p(tinput, flag + 1, len(tinput) - 1)
25         return sorted(tinput[:flag + 1])
26 #堆排序(TOP) 这是找最大的。
27 class Solution:
28     def __init__(self):
29         pass
30     def Heap(self, L, i, size):  #小根堆维护
31         root = i
32         left , right = 2*i+1, 2*i+2
33         if left < size and L[root]> L[left]:
34             root = left
35         if right < size and L[root]> L[right]:
36             root = right
37         if root != i:
38             L[root],L[i] = L[i],L[root]
39             self.Heap(L,root,size)
40         return L
41     def buildHeap(self, L):
42         for i in range(len(L)//2,-1,-1):
43             self.Heap(L,i,len(L))
44         return L
45     def TopK(self, L, k):
46         result = L[:k]
47         result = self.buildHeap(result)
48         for i in range(k,len(L)):
49             if L[i] > result[0]:
50                 result[0] = L[i]
51                 self.Heap(result, 0, k)
52         return result
53 """"""

 

posted @ 2019-08-11 16:37  WSX_1994  阅读(196)  评论(0)    收藏  举报