数组中的第K大元素

在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。
输入: [3,2,1,5,6,4] 和 k = 2
输出: 5
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4
输出: 4

  1. class Solution(object):
  2. def findKthLargest(self, nums, k):
  3. # 方法一:这里使用了自建堆,可以使用[0]等索引方法
  4. heap = [x for x in nums[:k]]
  5. heapq.heapify(heap)
  6. for i in range(k, len(nums)):
  7. if nums[i] > heap[0]:
  8. heapq.heappop(heap)
  9. heapq.heappush(heap, nums[i])
  10. return heap[0]
  11. class Solution(object):
  12. def findKthLargest(self, nums, k):
  13. # 方法二:堆的另一种方法,常用
  14. heap = []
  15. for i in nums:
  16. heapq.heappush(heap, i)
  17. if len(heap) > k:
  18. heapq.heappop(heap)
  19. return heap[0]
  20. class Solution(object):
  21. def findKthLargest(self, nums, k):
  22. # 方法三:快排,但不是最优解
  23. # 第k个最大的元素,即升序排列后,index为len(nums)-k
  24. k = len(nums) - k
  25. low = 0
  26. high = len(nums) - 1
  27. while low <= high:
  28. p = self.sort_nums(nums, low, high)
  29. if k < p:
  30. high = p-1
  31. elif k > p:
  32. low = p+1
  33. else:
  34. return nums[p]
  35. return -1
  36. def sort_nums(self, alist, low, high):
  37. mid_value = alist[low]
  38. while low <high:
  39. while low < high and alist[high] >= mid_value:
  40. high -= 1
  41. alist[low] = alist[high]
  42. while low < high and alist[low] <= mid_value:
  43. low += 1
  44. alist[high] = alist[low]
  45. alist[low] = mid_value
  46. return low
  47. # Go语言版
  48. func findKthLargest(nums []int, k int) int {
  49. return sort_nums(nums,k)
  50. }
  51. func sort_nums(nums []int, k int) int { //快排
  52. i := 0
  53. j := len(nums) - 1
  54. pivot := nums[0]
  55. for i < j{
  56. for i < j && nums[j] < pivot{
  57. j--
  58. }
  59. if i < j{
  60. nums[i], nums[j] = nums[j], nums[i]
  61. i++
  62. }
  63. for i < j && nums[i] > pivot{
  64. i++
  65. }
  66. if i < j{
  67. nums[i], nums[j] = nums[j], nums[i]
  68. j--
  69. }
  70. }
  71. if i+1 == k{
  72. return pivot // 位子恰好就是K-1返回结果
  73. }else if i+1 < k{
  74. return sort_nums(nums[i+1:], k-i-1) //以pivot为断点,在后半部分数组中进行查找
  75. }else{
  76. return sort_nums(nums[:i], k) //在前半部分数组中进行查找
  77. }
  78. }

前K个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。
输入: nums = [1,1,1,2,2,3], k = 2
输出: [1,2]
输入: nums = [1], k = 1
输出: [1]

  1. class Solution(object):
  2. def topKFrequent(self, nums, k):
  3. dicts = {}
  4. res = []
  5. for i in range(len(nums)):
  6. if nums[i] in dicts:
  7. dicts[nums[i]] += 1
  8. else:
  9. dicts[nums[i]] = 1
  10. for key, value in dicts.items():
  11. heapq.heappush(res, (value, key))
  12. if len(res) > k:
  13. heapq.heappop(res)
  14. return [x[-1] for x in res]

前K个高频单词

给一非空的单词列表,返回前 k 个出现次数最多的单词。
返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。
输入: [“i”, “love”, “leetcode”, “i”, “love”, “coding”], k = 2
输出: [“i”, “love”]
解析: “i” 和 “love” 为出现次数最多的两个单词,均为2次。
注意,按字母顺序 “i” 在 “love” 之前。
输入: [“the”, “day”, “is”, “sunny”, “the”, “the”, “the”, “sunny”, “is”, “is”], k = 4
输出: [“the”, “is”, “sunny”, “day”]
解析: “the”, “is”, “sunny” 和 “day” 是出现次数最多的四个单词,
出现次数依次为 4, 3, 2 和 1 次。

  1. class Solution(object):
  2. def topKFrequent(self, words, k):
  3. dicts = {}
  4. res = []
  5. for i in range(len(words)):
  6. if words[i] not in dicts:
  7. dicts[words[i]] = 1
  8. else:
  9. dicts[words[i]] += 1
  10. for key, value in dicts.items():
  11. heapq.heappush(res, (-value, key))
  12. tmp = []
  13. for _ in range(k):
  14. tmp.append(heapq.heappop(res)[-1])
  15. return tmp

根据字符出现频率排序

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
输入:
“tree”
输出:
“eert”
解释:
‘e’出现两次,’r’和’t’都只出现一次。
因此’e’必须出现在’r’和’t’之前。此外,”eetr”也是一个有效的答案。
输入:
“cccaaa”
输出:
“cccaaa”
解释:
‘c’和’a’都出现三次。此外,”aaaccc”也是有效的答案。
注意”cacaca”是不正确的,因为相同的字母必须放在一起。

  1. class Solution(object):
  2. def frequencySort(self, s):
  3. dicts = {}
  4. lists = []
  5. res = ''
  6. # 计数
  7. for i in range(len(s)):
  8. if s[i] in dicts:
  9. dicts[s[i]] += 1
  10. else:
  11. dicts[s[i]] = 1
  12. # 根据次数使用堆排序
  13. for key, value in dicts.items():
  14. heapq.heappush(lists, (value, key))
  15. # 拼凑字符串
  16. while lists:
  17. tmp = heapq.heappop(lists)
  18. res = tmp[0]*tmp[-1] + res
  19. return res