最小的K个数:
思路一:类似于第29题,直接进行Partion,直到返回值未K – 缺点是需要修改输入的数据
思路二:维护一个大顶堆,然后遍历一次给定数组
如果当前堆元素小于K个
那么直接将当前元素加入堆中,并调整堆
如果当前堆中元素等于K个
如果当前遍历数据小于堆顶元素,那么删除堆顶然后将当前元素插入堆,并调整堆
如果当前遍历元素大于堆顶,那么什么也不做
由于建立堆和调整堆的大小的时间复杂度都是logK,而且整个过程只需要遍历一遍数组,因此时间复杂度是O(N*logK)
ps:这个堆可以自己实现,不足一百行代码,更简单的,也可以直接使用简易堆,只拥有建立和调整两个操作

public class _Q30<T> {public int[] GetLeastNumbers(int array[], int k){if(array == null || k < 0 || k >= array.length) return null;int result[] = Arrays.copyOfRange(array, 0, k);buildMaxHeap(result);for(int i=k; i<array.length; i++){if(array[i] < result[0]){result[0] = array[i];maxHeapify(result, 0);}}return result;}private void buildMaxHeap(int heap[]){if(heap == null) return;for(int i=(heap.length/2); i>=0; i--){maxHeapify(heap, i);}}// 保持堆的性质:将较小元素逐渐下沉至叶子节点private void maxHeapify(int heap[], int index){if(heap == null || index < 0) return;if(index >= heap.length) return;int indexL = 2*index + 1;int indexR = indexL + 1;int largestIndex = index;if(indexL < heap.length && heap[indexL] > heap[index]){largestIndex = indexL;}if(indexR < heap.length && heap[indexR] > heap[index]){largestIndex = indexR;}if(largestIndex != index){int temp = heap[largestIndex];heap[largestIndex] = heap[index];heap[index] = temp;maxHeapify(heap, largestIndex); // 由于调整之后,可能破坏了子结构,递归调整}}}

测试代码:

public class _Q30Test extends TestCase {_Q30 topK = new _Q30();public void test(){int nums1[] = {1, 2, 3, 2, 2, 2, 5, 4, 2};int nums2[] = {4, 5, 1, 6, 2, 7, 3, 8};int result1[] = topK.GetLeastNumbers(nums1, 5);int result2[] = topK.GetLeastNumbers(nums2, 4);int result3[] = topK.GetLeastNumbers(nums2, nums2.length);int result4[] = topK.GetLeastNumbers(null, 1);CommonUtils.PrintArray(result1);CommonUtils.PrintArray(result2);CommonUtils.PrintArray(result3);CommonUtils.PrintArray(result4);}}

【剑指offer-Java版】30最小的K个数相关推荐

  1. 剑指offer面试题[30]-最小的k个数

    题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4. 分析思路:         这道题最简单的思路莫过于把输入的n个数排 ...

  2. 剑指 Offer II 061. 和最小的 k 个数对

    链接:剑指 Offer II 061. 和最小的 k 个数对 题解: class Solution { public:vector<vector<int>> kSmallest ...

  3. 【剑指Offer】29、最小的K个数

      题目描述:   输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4.   解题思路:   本题最直观的解法就是将输入的n个整数排 ...

  4. 剑指offer: 面试题40. 最小的k个数

    题目:最小的k个数 入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1] ...

  5. 剑指Offer - 面试题40. 最小的k个数(排序/大顶堆)

    1. 题目 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 示例 1: 输入:arr = [3,2,1], k ...

  6. 剑指offer面试题40. 最小的k个数(sort函数)

    题目描述 输入整数数组 arr ,找出其中最小的 k 个数.例如,输入4.5.1.6.2.7.3.8这8个数字,则最小的4个数字是1.2.3.4. 思路 详见链接 代码 class Solution: ...

  7. 剑指offer java版 test3—从尾到头打印链表

    标题:剑指offer java版 test3-从尾到头打印链表 题目:输入一个链表,按链表从尾到头的顺序返回一个ArrayList. 解答:知识不够全面,用ArrayList做的 但是看到大佬们还可以 ...

  8. 剑指offer java版(三)

    二叉搜索树的后序遍历 问题描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 对于后序遍历来说, ...

  9. 剑指offer java版 test42—找出和为S的两个数,左右夹逼法(双指针法)

    前言:受上一题的启发,这题自己也编出来了.在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围.很实用. 题目: 输入一个递增排序的数组和一个数字S, ...

  10. 剑指offer java版(一)

    二维数组中的查找 问题描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数 ...

最新文章

  1. c#分布式ID生成器
  2. 在ubuntu16.04中一键创建LAMP环境
  3. 关于CheckBoxList和RadioButtonList的几个问题
  4. 反思前进路上碰到困难时 应有的应对方法
  5. Java源文件声明规则
  6. Multi-thread--C++11中std::lock_guard的使用
  7. linux 动态库系统目录,Linux共享库.so文件的命名和动态链接
  8. TensorFlow tf.keras.losses.SparseCategoricalCrossentropy
  9. iFrame只要竖滚动条,不要横滚动条
  10. 优达学城 python 人工智能入门_深度学习TensorFlow入门资源汇总-如何从零开发人工智能...
  11. 算法|决策树算法究竟说的是什么?
  12. Pytm:威胁建模框架
  13. 阴险的codeproject
  14. 澄清server push/websocket/sse的一些概念
  15. 学完计算机控制系统的感受,管理信息系统学习心得体会(精选5篇)
  16. Unity网格合并插件MeshBaker的简单使用
  17. python爬虫(五):博客spider
  18. How Much Should We Invest for Network Facility: Quantitative Analysis on Network ’Fatness’ and Machi
  19. Sentinel LDK配置记录
  20. 无界函数的极限审敛法

热门文章

  1. oracle乘法运算,oracle实现相乘话语
  2. python compiler库_Python之compiler:compiler库的简介、安装、使用方法之详细攻略
  3. MATLAB修改工作环境
  4. cvCreateMat函数
  5. class.forname找不到类_15个“专科专业”就业找工作容易,关注热度也挺高,报考比较靠谱...
  6. python生成wheel包注意事项
  7. 在Ubuntu上通过命令行安装Elisa KDE音乐播放器
  8. ubuntu svn安装
  9. 在linux系统 挂载光盘:mount时提示: you must specify the filesystem type
  10. Android CursorAdapter