寻找最小的K个数
同上一篇,使用堆排序的方式做。
第一步构建最小堆,构建好之后数组的第一个元素就是最小的;
第二步排序,开始执行k-1次sift,每次将剩余元素中最小的元素放到未排序元素的末尾
第三步,将数组的后k个数返回即为数组中最小的k个数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | 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) } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能