面试常见算法题目
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 """"""

浙公网安备 33010602011771号