29、剑指offer--最小的K个数

题目描述

输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。

解题思路:使用multiset存储k个最小值

1)先存入k个值

2)用multiset中的最大值和当前访问数组元素比较,若小于则把该值从multiset中移除,数组元素插入

3)遍历multiset将k个值存入vector中
注意事项:边界条件的判断,数组为空,k小于1,以及k大于数组元素数目

 1 class Solution {
 2 public:
 3     vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {
 4         vector<int> result;
 5         if(input.empty() || k<1 || input.size()<k)
 6             return result;
 7         multiset<int> insert_set;
 8
 9         set<int>::iterator it; //定义前向迭代器
10         multiset<int>::reverse_iterator rit; //定义反向迭代器
11         for(int i=0;i<input.size();i++)
12         {
13
14             if(i<k)
15             {
16                 insert_set.insert(input[i]);
17             }
18
19             else
20             {
21                 rit = insert_set.rbegin();
22                 if(input[i] < *rit)
23                 {
24
25                     insert_set.erase(*rit);
26                     insert_set.insert(input[i]);
27                 }
28             }
29         }
30
31
32         for(it = insert_set.begin(); it != insert_set.end(); it++)
33         {
34             result.push_back(*it);
35         }
36         return result;
37     }
38 };
时间: 2024-11-05 22:46:03

29、剑指offer--最小的K个数的相关文章

剑指offer | 最小的K个数

题目描述:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目解析:首先想到的就是插入法,.改进一下就是前面一直保持7个有序数字.遍历剩下数组,元素若小于最大值就交换.用C++的set来解决代码就简洁多了,删除插入都是logk. 代码如下: 1 class Solution { 2 public: 3 vector<int> GetLeastNumbers_Solution(vector<int> inpu

python剑指offer最小的K个数

题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 思路: 使用快排中的partition思想. ①我们设定partition函数的哨兵为key=lists[left],在partition函数中完成一轮比较的结果是,比key大的数都在其右边,比key小的数放在其左边.完成该轮后返回其left=right时left的值. ②我们判断left的值是比k大还是小: 如果left的值比k大,说明上轮partition之

剑指Offer-29.最小的K个数(C++/Java)

题目: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 分析: 最先想到的是将数组升序排列,返回前k个元素.不过排序的话效率可能会较低,我们可以使用优先级队列模拟堆来处理. 模拟一个k个元素的最大堆,当堆内元素个数等于k的时候,新来的元素就要和堆顶元素去比较,如果小于堆顶元素,就删除堆顶元素,将新元素添加进堆中,由于最大堆的堆顶元素是最大元素,我们可以保持堆中元素始终是最小的几个,因为每有新的元素来,都会进行比较,最后堆

剑指Offer28 最小的K个数

包含了Partition函数的多种用法 以及大顶堆操作 1 /************************************************************************* 2 > File Name: 28_KLeastNumbers.cpp 3 > Author: Juntaran 4 > Mail: [email protected] 5 > Created Time: 2016年08月31日 星期三 19时45分41秒 6 *******

剑指Offer--030-最小的K个数

链接 牛客OJ:最小的K个数 九度OJ:http://ac.jobdu.com/problem.php?pid=1371 GitHub代码: 030-最小的K个数 CSDN题解:剑指Offer–030-最小的K个数 牛客OJ 九度OJ CSDN题解 GitHub代码 最小的K个数 1371-最小的K个数 剑指Offer–030-最小的K个数 030-最小的K个数 题意 题目描述 输入n个整数,找出其中最小的K个数. 例如输入4,5,1,6,2,7,3,8这8个数字, 则最小的4个数字是1,2,3

剑指offer——倒数第k个节点

先走k-1步,然后判断fast有没有到空为止. /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public ListNode FindKthToTail(ListNode head,int k) { if(head==null||k<=0) { return null; } ListNode fa

java实现——030最小的k个数

1.O(nlogk)海量数据 1 import java.util.TreeSet; 2 3 public class T030 { 4 public static void main(String[] args){ 5 int[] data = {4,5,1,6,2,7,3,8}; 6 TreeSet<Integer> leastNumbers = new TreeSet<Integer>(); 7 getLeastNumbers(data,leastNumbers,4); 8

剑指offer(29)最小的K个数

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 题目分析 这题有两种方法来做. 第一种就是基于partition的方法,详见我的另一篇文章:基于快排思想查找第K大的数或第K小的数. 第二种就是利用一个长度为k的额外容器,来存储最小的K个数字.容器未满则填满,再添加数字是,将数字和容器的最大值比较,小的话就替换,大的话舍去. 这个容器要求可以直接得到最大值.能删除最大值,能添加值.那么很容易想到应该用最大堆当这个

剑指offer[29]——最小的K个数

题目描述 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 这道题目对js来讲应该是很简单了,js有自带的sort函数,我们将输入的数组进行排序之后,输出前k个数就是题目要求 的结果. function GetLeastNumbers_Solution(input, k) { if(k==0 || k>input.length){return [];} input = input.sort((a,b) => a-b);