Advertisement
Guest User

Untitled

a guest
Jul 18th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.35 KB | None | 0 0
  1. class Solution:
  2. """
  3. @param nums: the given array
  4. @param k: the given k
  5. @return: the k most frequent elements
  6. """
  7. def topKFrequent(self, nums, k):
  8. # Counter {1: 3, 2: 2, 3: 1}
  9. # bucket sort, convert counter hashtable to a list of (k, v) tuples reversely sorted based on v
  10. from collections import Counter
  11. nums_count = Counter(nums)
  12. counts = [(k,v) for k, v in nums_count.items()]
  13. freq_list = self.quick_sort(counts, 0, len(counts) - 1, k)
  14.  
  15. return [_[0] for _ in freq_list]
  16.  
  17. def quick_sort(self, counts, left, right, k):
  18. pivot = counts[left]
  19. l, r = left, right
  20. while l <= r:
  21. while l <= r and counts[l][1] < pivot[1]:
  22. l += 1
  23. while l <= r and counts[r][1] > pivot[1]:
  24. r -= 1
  25.  
  26. if l <= r:
  27. counts[l], counts[r] = counts[r], counts[l]
  28. l += 1
  29. r -= 1
  30.  
  31. # print('+++', counts)
  32. # counts[left], counts[l] = counts[l], counts[left]
  33. print(l, left, pivot, '-----', counts)
  34. if l == k:
  35. return counts[:l]
  36. elif l < k:
  37. return self.quick_sort(counts, l, right, k)
  38. else:
  39. return self.quick_sort(counts, left, l - 2, k)
  40.  
  41. return counts[:k]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement