同上一篇,使用堆排序的方式做。

第一步构建最小堆,构建好之后数组的第一个元素就是最小的;

第二步排序,开始执行k-1次sift,每次将剩余元素中最小的元素放到未排序元素的末尾

第三步,将数组的后k个数返回即为数组中最小的k个数。

func getLeastNumbers(arr []int, k int) []int {
	if k == 0 {
		return []int{}
	}
	buildMinHeap(arr)
	for i := len(arr) - 1; i > 0; i-- {
		arr[i], arr[0] = arr[0], arr[i]
		siftDown(arr, 0, i)
	}
	return arr[len(arr)-k:]
}

func buildMinHeap(arr []int) {
	for i := len(arr)/2 - 1; i >= 0; i-- {
		siftDown(arr, i, len(arr))
	}
}

func siftDown(arr []int, idx, size int) {
	left := idx*2 + 1
	right := left + 1
	smallest := idx

	if left < size && arr[left] < arr[smallest] {
		smallest = left
	}
	if right < size && arr[right] < arr[smallest] {
		smallest = right
	}
	if smallest != idx {
		arr[smallest], arr[idx] = arr[idx], arr[smallest]
		siftDown(arr, smallest, size)
	}
}

  

相关文章:

  • 2021-09-14
  • 2022-12-23
  • 2022-02-01
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-07-22
猜你喜欢
  • 2021-11-11
  • 2021-11-13
  • 2021-06-17
  • 2022-12-23
  • 2018-03-30
相关资源
相似解决方案