k个最小的数

输入n个整数,输出k个最小的数。例如输入4,5,1,6,2,7,3,8这8个数,则最小的4个数字是1,2,3,4。利用堆排序

(1)遍历数组,将前k个数插入到堆中,使用multiset来实现堆(2)继续从输入数组中读入元素,作为待插入的整数,并将它与堆中的最大值进行比较,若待插入的值比这个最大值小,则用它替换最大值,否则抛弃这个数,继续读取下一个数.动态的维护堆中的数都是最小的,最后输出堆即可.multiset和set的区别是multiset允许元素重复.如果本题变为求k个最大的数,则将最大堆变为最小堆,并且继续从输入数组中读入元素,作为待插入的整数,将它与堆中的最小值进行比较,若待插入的值比这个最小值大,则用它替换最小值,否则抛弃这数,继续读取下一个数,动态的维护堆中的数都是最大的,最后输出堆即可.vector<int> GetLeastNumber(vector<int> input,int k)
    {
         vector<int> result;
         int lenth=input.size();
         if(input.empty()||lenth<k||k<=0)
             {
                 return result;
             }
         multiset<int,greater<int>> leastnumber;         multiset<int,greater<int>> ::iterator itergreater;
         vector<int> ::iterator iter=input.begin();
        for(;iter!=input.end();++iter)
          {
              if(leastnumber.size()<k)
                 {
                     leastnumber.insert(*iter);
                 }
              else
                 {
                   itergreater=leastnumber.begin();
                   if(*iter<*itergreater)
                     {
                        leastnumber.erase(itergreater);
                        leastnumber.insert(*iter);
                     }
                 }
            }
           for(iter=leastnumber.begin();iter!=leastnumber.end();++iter)
             {
                  result.push_back(*iter);
             }
        return result;
    }

原文地址:https://www.cnblogs.com/czy4869/p/9058414.html

时间: 2024-08-28 16:15:25

k个最小的数的相关文章

A题之找K个最小的数

剑指offer上的一道题:输入n个整数,找出最小的k个数.例如输入4.5.1.6.2.7.3.8共8个数,最小的4个数为:1.2.3.4. 分析: 解法一: 可以把它看车数组排序问题,先对数组排序,再取数组前k个数.各个排序算法中,快排是性价比比较高的了,时间事件复杂度为O(n*logn).还有没有其他解法呢? 解法二: 快排思想派上用场了.快排算法中,我们通常要找一个参考元素,针对这个元素把数组分为俩个子数组.元素左边的子数组小于该元素,元素右边的子数组小于该元素.对了!只要找到一个元素使得他

在集合中查找前k个最小的数

1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define SIZE 10 5 6 int * k_thSmallest(int * arr, int len, int k_len); 7 8 void find(int* arr, int low, int high, int k_len); 9 10 void swap(int * a, int *b); 11 12 void printArr(int * arr, int le

剑指OFFER之把数组排成最小的数(九度OJ1504)

题目描述: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个整数m (1<=m <=100)代表输入的正整数的个数.输入的第二行包括m个正整数,其中每个正整数不超过10000000. 输出: 对应每个测试案例,输出m个数字能排成的最小数字. 样例输入: 3 23 13 6 2 23456 56 样

把数组排成最小的数-剑指Offer

把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 思路 把两个int类型的数拼起来可能会比较大,溢出,我们可采用字符串来表示,处理大数问题 将数字转化为字符串,然后比较字符串的大小,此处的大小指的是:若str1+str2 > str2+str1,则str1 > str2, 我们需要重新定义一个compare函数 其实最后的连接起来的大小和

最小的数?

Problem DescriptionKiki likes traveling. One day she finds a magic lamp, unfortunately the genie in the lamp is not so kind. Kiki must answer a question, and then the genie will realize one of her dreams.The question is: give you an integer, you are

最小的数

最小的数 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 29   Accepted Submission(s) : 16 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description Input 本题只有唯一一组测试数据,第一行给出N,q,表示K的

输入10个数,将其中最小的数与第一个对换,最大的数与最后一个对换

输入10个整数,将其中最小的数与第一个数对换,将最大的数与最后一个数对换. 写三个函数:1.输入10个整数 2.进行处理 3.输出10个数 #include "stdafx.h" #include<iostream> using namespace std; int array[10],*p; //第一个函数,输入数字 void shuru(int *p) { cout<<"请输入十个整数:"<<endl; for(int i=0

2015 湘潭大学程序设计比赛(Internet)--D题-最小的数

最小的数 Accepted : 47   Submit : 276 Time Limit : 1000 MS   Memory Limit : 65536 KB 题目描述 给你一个n位数,每次操作可以选该数任意的相邻两位进行交换,如果最多可以操作k次,那么最终可以得到的最小的数是什么 (n位且不能含前导零)? 输入 有多组测试数据,第一行为数据个数T(T<=10); 每组数据占一行,包含一个数(不超过1000位)和k(0<=k<=1000),中间用空格隔开; 输出 最终能得到的最小的数.

hdu 1728 bfs 最小拐弯数

链接:http://acm.hdu.edu.cn/showproblem.php?pid=1728 之前没有做过类似这种要最少拐弯数的题目,一般求最少的用bfs应该比较好..但是之前bfs一般都是用来求最小步数,也就可以标记过走过的点不再走.现在本题要的是最小的拐弯数,所以不能标记走过的点..需要一个数组来记录当前这个点所需要的最小拐弯数,如果此时这个点的拐弯数比之前该点的拐弯数还小或者等于就更新这个值.遍历全图直到找到解为止. 学习:对于bfs找最优解的变形.明白如何更新拐弯数的,保证最小.