剑指offer 面试题30 最小的 k 个数
来源:互联网 发布:类似皮影客的软件 编辑:程序博客网 时间:2024/06/06 11:00
剑指offer 面试题30 最小的 k 个数
题目:
输入 n 个整数,找出其中最小的 k 个数。
例如输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数是 1、2、3、4。
package algorithm.foroffer.top30;import java.util.*;/** * Created by liyazhou on 2017/5/29. * 面试题30:最小的 k 个数 * * 题目: * 输入 n 个整数,找出其中最小的 k 个数。 * 例如输入 4、5、1、6、2、7、3、8 这 8 个数字,则最小的 4 个数是 1、2、3、4。 * * 问题: * 1. 最大堆 * * 思路: * 1. 使用最大堆,优先队列 PriorityQueue 和比较器 Comparator * 2. 将数组的中前 k 个数字存储到 最大堆中 * 3. 遍历在数组区间[k,n)的元素, * 如果该元素小于最大堆中的第一个元素,则最大堆中的第一个元素出队,将该元素加入最大堆中 */public class Test30 { /** * AC * 2017-8-14 10:55:53 */ public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { if (k <= 0 || k > input.length) return new ArrayList<Integer>(); PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(k, Collections.reverseOrder()); // PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(k); for (int i = 0; i < k; i ++) maxHeap.offer(input[i]); for (int j = k; j < input.length; j ++){ if (input[j] < maxHeap.peek()){ maxHeap.poll(); maxHeap.offer(input[j]); } } // ArrayList<Integer> result = new ArrayList<>(k); // for (int i = 0; i < k; i ++){ // int idx = k - i - 1; // 逆序保存 // result.add(idx, maxHeap.poll()); // } Integer[] result = new Integer[k]; for (int i = 0; i < k; i ++){ int idx = k - i - 1; result[idx] = maxHeap.poll(); } return new ArrayList<>(Arrays.asList(result)); } //--------------------------------------------------------------- public Integer[] minNums(int[] array, int k){ Queue<Integer> maxHeap = getMaxHeap(k); for (int i = 0; i < k; i++) maxHeap.offer(array[i]); for (int i = k; i < array.length; i++) if (array[i] < maxHeap.peek()){ maxHeap.poll(); maxHeap.offer(array[i]); } return maxHeap.toArray(new Integer[0]); } private Queue<Integer> getMaxHeap(int k){ Comparator<Integer> revCmp = new Comparator<Integer>(){ @Override public int compare(Integer first, Integer second){ return second - first; } }; // Comparator<Integer> revCmp = Collections.reverseOrder(); return new PriorityQueue<>(k, revCmp); } public static void main(String[] args){ int[][] arrays = { {4, 5, 1, 6, 2, 7, 3, 8}, {4, 5, 1, 6, 2, 7, 3, 8, -1, 10, -2}, }; for (int i = 0; i < arrays.length; i++){ Integer[] minNums = new Test30().minNums(arrays[i], 5); System.out.println(Arrays.toString(minNums)); } }}
阅读全文
1 0
- 剑指offer面试题30最小的k个数
- [剑指offer][面试题30]最小的k个数
- 【剑指offer】面试题30:最小的K个数
- 剑指Offer:面试题30 最小的k个数
- 剑指offer:面试题30,求最小的K个数
- 剑指offer 面试题30—最小的k个数
- 剑指offer 面试题30 最小的K个数
- 【剑指Offer学习】【面试题30:最小的k个数】
- 剑指offer-面试题30:最小的K个数
- 剑指offer之面试题30:最小的k个数
- 剑指offer之面试题30最小的k个数
- 剑指Offer----面试题30:最小的K个数
- 剑指offer-----面试题30(最小的k个数)
- 剑指offer面试题30:最小的K个数
- 剑指offer--面试题30:最小的K个数
- 剑指Offer之面试题30:最小的K个数
- 剑指offer-面试题30-最小的k个数
- 剑指Offer系列-面试题30:最小的K个数
- 手把手教你多页面递归爬虫--基于Node.Js
- hibernate 关联表中有其他属性处理方法
- 较为简单的python学习
- 【XML解析】(4)Java下使用DOM4J解析方式对XML文档进行解析
- maven(15)------maven打包时报错Fatal error compiling: 无效的目标发行版: 1.8.0_91
- 剑指offer 面试题30 最小的 k 个数
- JNDI
- U-boot在S3C2440上的移植详解(一)
- 【机房重构】--职责链模式+策略模式 实现下机
- 1015: 二次方程的实根
- 算法设计与分析(15) -- Generate Parentheses(难度:Medium)
- jqueryMobile 按钮
- API(Calendar类)
- 动态规划测试test20170518