博客
关于我
【ACWing】53. 最小的k个数
阅读量:241 次
发布时间:2019-02-28

本文共 1894 字,大约阅读时间需要 6 分钟。

要解决从n个整数中找出k个最小数的问题,可以使用Quick Select算法。该算法通过递归选择数组中的中间元素作为枢轴,将数组划分为左右两部分,然后确定目标元素所在的子数组继续查找。以下是详细的解决方法:

方法思路

  • 问题分析:我们需要从n个整数中找出k个最小的数,并按升序排列。常见的方法有Heap和Quick Select算法,这里选择Quick Select。
  • 算法选择:Quick Select算法类似于快速排序,通过选择中间元素作为枢轴,将数组分为左右两部分,递归处理子数组,直到找到目标位置。
  • 优化思路:选择中间元素作为枢轴,调整左右指针,交换元素位置,并根据枢轴位置决定递归方向。这种方法的时间复杂度为O(n + k log k),空间复杂度为O(log n)。
  • 解决代码

    #include 
    #include
    #include
    using namespace std;class Solution {public: void quick_select(vector
    &v, int l, int r, int idx) { if (l >= r) return; int mid = l + (r - l) / 2; int x = v[mid]; int i = l, j = r; while (i <= j) { while (v[i] < x) i++; while (v[j] > x) j--; if (i <= j) { swap(v[i], v[j]); i++; j--; } } if (idx <= j) { quick_select(v, l, j, idx); } else if (idx >= i) { quick_select(v, i, r, idx); } } vector
    getLeastNumbers_Solution(vector
    input, int k) { if (k == 0) return {}; if (k == input.size()) { sort(input.begin(), input.end()); return input; } quick_select(input, 0, input.size() - 1, k - 1); sort(input.begin(), input.begin() + k); vector
    res; for (int i = 0; i < k; ++i) { res.push_back(input[i]); } return res; }};int main() { vector
    input = {1, 2, 3, 4, 5}; int k = 3; Solution sol; vector
    result = sol.getLeastNumbers_Solution(input, k); for (int num : result) { cout << num << " "; } return 0;}

    代码解释

  • 类定义Solution类包含两个成员函数quick_selectgetLeastNumbers_Solution
  • 快速选择函数quick_select递归地选择中间元素作为枢轴,调整指针i和j,直到找到目标位置。
  • 获取最小数函数getLeastNumbers_Solution调用quick_select,然后对前k个元素排序并返回结果。
  • 主函数:读取输入数组,调用解决方案函数,并输出结果。
  • 通过这种方法,我们可以高效地从数组中找出k个最小的数,并按升序排列。

    转载地址:http://xqjs.baihongyu.com/

    你可能感兴趣的文章
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>
    NN&DL4.3 Getting your matrix dimensions right
    查看>>
    NN&DL4.8 What does this have to do with the brain?
    查看>>
    nnU-Net 终极指南
    查看>>
    No 'Access-Control-Allow-Origin' header is present on the requested resource.
    查看>>