首页 > 其他分享 >剑指offer:最小的K个数

剑指offer:最小的K个数

时间:2022-12-01 19:01:42浏览次数:31  
标签:index right offer int res 个数 最小 heap input


题目描述

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

方法一

O(n)

改变输入,适合小数据

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {

int len = input.size();
vector<int> res;

//注意k<=0的异常输入
if (k <= 0 || len < k){
return res;
}

int left = 0, right = len - 1;
int index = partition(input, left, right);

while (index != k - 1){
if (index < k - 1){
left = index + 1;
index = partition(input, left, right);
}
else{
right = index - 1;
index = partition(input, left, right);
}
}

for (int i = 0; i <= k - 1; i++){
res.push_back(input[i]);
}

return res;
}
private:
int partition(vector<int> &input, int left, int right){
int i = left, j = right;
int pivot = input[i];

while (i < j){
while (i<j && input[j]>pivot) j--;
if (i < j){
input[i++] = input[j];
}

while (i < j&&input[i] <= pivot) i++;
if (i < j){
input[j--] = input[i];
}
}

input[i] = pivot;

return i;
}

};

方法二

大顶堆,适合于大数据情形

class Solution {
public:
vector<int> GetLeastNumbers_Solution(vector<int> input, int k) {

vector<int> res;

int len = input.size();

if (k <= 0 || k > len){
return res;
}

priority_queue<int> heap;

for (int i = 0; i < len; i++){
if (heap.size() < k){
heap.push(input[i]);
}
else{
if (input[i] < heap.top()){
heap.pop();
heap.push(input[i]);
}
}
}


while (!heap.empty()){
res.push_back(heap.top());
heap.pop();
}

return res;
}
};


标签:index,right,offer,int,res,个数,最小,heap,input
From: https://blog.51cto.com/u_15899184/5903625

相关文章

  • 剑指offer:翻转单词顺序列
    题目描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“s......
  • 汇编程序:输入一个数并显示出现
    codesegment;代码段定义开始assumecs:codestart:movah,1int21hmovdl,al;输入的数在al中,赋值到dlmovah,2;调用2号功能调用输出字符......
  • 剑指offer题解C++版
    一,常见数据结构1,数组3-找出数组中重复的数字4-二维数组中的查找5-替换空格29-顺时针打印矩阵leetcode989-数组形式的整数加法leetcode26-删除有序数组中的重复......
  • 最小斯坦纳树&最小树形图
    两个知识点。首先是最小树形图,意思是有一张带权有向图,钦定一个点,希望保留一些边使得这个点可以到达所有点,最小化边权和。思路上就是说贪心地选择每个点权最小的入边并加入......
  • 最小生成树算法及其常见应用
    最小生成树定义:在无向图\(G=(V,E)\)中,一颗连接所有节点的树(无根树)被称为这个无向图的生成树,其中边权之和最小的那一颗被称为最小生成树定理:最小生成树一定包含无向图中......
  • 二进制中1的个数
    给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。#include<iostream>usingnamespacestd;intlowbit(intx){returnx&(-x);}......
  • 数列中的第k个数
    给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。#include<iostream>usingnamespacestd;constintN=10001......
  • 力扣 leetcode 153. 寻找旋转排序数组中的最小值
    问题描述已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,2,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4......
  • 2022助我拿到9个Offer的成功秘籍?MySQL高级调优笔记 冲就完了
    第一部分:MySQL常用对象=================Linux安装MySQL及启动MySQL对象-索引MySQL对象-视图MySQL对象-存储过程MySQL对象-触发器第二部......
  • js如何判断两个数组是否有重复的元素
    原文:https://www.yisu.com/zixun/730087.htmljs如何判断两个数组是否有重复的元素leta=[1,2,3];letb=[3,5,2];newA=newSet(a);newB=newSet(b);letin......