3月打卡活动第20天 面试题第40题:最小的k个数(简单)

2023-11-12

3月打卡活动第20天 面试题第40题:最小的k个数(简单)

  • 题目:输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。
    在这里插入图片描述
  • 解题思路:排序,取前k个值。
class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        int[] ans = new int[k];
        if(arr.length==0 || k==0) return ans;
        if(k==arr.length) return arr;
        Arrays.sort(arr);
        
        for(int i=0;i<k;i++) ans[i] = arr[i];
        return ans;
    }
}

在这里插入图片描述

  • 题解思路:快速排序法
class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k == 0 || arr.length == 0) {
            return new int[0];
        }
        // 最后一个参数表示我们要找的是下标为k-1的数
        return quickSearch(arr, 0, arr.length - 1, k - 1);
    }

    private int[] quickSearch(int[] nums, int lo, int hi, int k) {
        // 每快排切分1次,找到排序后下标为j的元素,如果j恰好等于k就返回j以及j左边所有的数;
        int j = partition(nums, lo, hi);
        if (j == k) {
            return Arrays.copyOf(nums, j + 1);
        }
        // 否则根据下标j与k的大小关系来决定继续切分左段还是右段。
        return j > k? quickSearch(nums, lo, j - 1, k): quickSearch(nums, j + 1, hi, k);
    }

    // 快排切分,返回下标j,使得比nums[j]小的数都在j的左边,比nums[j]大的数都在j的右边。
    private int partition(int[] nums, int lo, int hi) {
        int v = nums[lo];
        int i = lo, j = hi + 1;
        while (true) {
            while (++i <= hi && nums[i] < v);
            while (--j >= lo && nums[j] > v);
            if (i >= j) {
                break;
            }
            int t = nums[j];
            nums[j] = nums[i];
            nums[i] = t;
        }
        nums[lo] = nums[j];
        nums[j] = v;
        return j;
    }
}

在这里插入图片描述

  • 题解做法2:还是第一次遇见堆的做法
// 保持堆的大小为K,然后遍历数组中的数字,遍历的时候做如下判断:
// 1. 若目前堆的大小小于K,将当前数字放入堆中。
// 2. 否则判断当前数字与大根堆堆顶元素的大小关系,如果当前数字比大根堆堆顶还大,这个数就直接跳过;
//    反之如果当前数字比大根堆堆顶小,先poll掉堆顶,再将该数字放入堆中。
class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k == 0 || arr.length == 0) {
            return new int[0];
        }
        // 默认是小根堆,实现大根堆需要重写一下比较器。
        Queue<Integer> pq = new PriorityQueue<>((v1, v2) -> v2 - v1);
        for (int num: arr) {
            if (pq.size() < k) {
                pq.offer(num);
            } else if (num < pq.peek()) {
                pq.poll();
                pq.offer(num);
            }
        }
        
        // 返回堆中的元素
        int[] res = new int[pq.size()];
        int idx = 0;
        for(int num: pq) {
            res[idx++] = num;
        }
        return res;
    }
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

3月打卡活动第20天 面试题第40题:最小的k个数(简单) 的相关文章

  • 字符串相关,可变长字符串,异常

    字符串相关 String 字符串常量 本质char String str1 abc String str2 abc System out prrintln str1 str2 同时也会带来这样的问题 String a a a a b ab
  • Vue axios的使用

  • cmake知识点总结

    CMake的所有的语句都写在一个叫 CMakeLists txt 的文件中 当 CMakeLists txt 文件确定后 可以用 ccmake 命令对相关的变量值进行配置 这个命令必须指向 CMakeLists txt 所在的目录 配置完成

随机推荐

  • 操作系统_第四章_存储管理之 页式存储管理

    思考一个问题 是否有可能把相对地址连续的作业信息分散存放到几个不连续的主存区域中 且仍然能保证作业正确执行 若可行的话 既可充分利用主存空间又可减少移动所花费的开销 页式存储管理就是这样的管理方式 一 页式存储管理的基本原理 定义 页式存储
  • Vue3打包后无法运行

    描述 使用Vue3打包项目后 使用Live Server打开无法运行 放到服务器上也是一样 如图所示错误 分析 错误提示为js文件未找到 所以可能是路径的问题 关于Vue公共基础路径问题 https cn vitejs dev guide
  • android开发笔记(1-5)(易错点以及技术难点攻克)

    1 scrollview中嵌套有listview或者gridview 从其他页面返回到这个页面 焦点总是跑到listview或者gridview上 解决办法 重写scrollview的下边方法 Override protected int
  • 使用cloudflare搭建个人博客网站实践

    使用cloudflare搭建个人博客网站 首先配置好基本的环境 建议使用LNMP工具建立基本的环境 按照上面的教程可以基本完成采用http网站的初步建立 但是对于https的支持上面说的并不好 因此需要进一步的改进 要自己配置https其实
  • MySQL进阶 -- 视图

    MySQL进阶 视图 一 介绍 二 语法 三 检查选项 CASCADED 级联 LOCAL 本地 四 视图更新 五 视图作用 六 案例 一 介绍 视图 view 是一个虚拟表 非真实存在 其本质是根据SQL语句获取动态的数据集 并为其命名
  • 快速设计元器件原理图库和PCB封装库

    目录 1 立创商城EDA免费库 2 Altium Library Loader 3 贸泽电子ECAD模型 在设计电路的过程中经常会遇到这样的问题 无法快速找到合适的元器件原理图封装和PCB封装 Footprint 通常最基本的做法是百度找找
  • 爬虫学习笔记(十九)—— 滑动验证码

    文章目录 一 概念 二 实现步骤 2 1 获取验证码图片 2 1 1 获取缺口图 2 1 2 获取滑块图 2 1 3 获取完整图 2 1 4 完整代码 2 2 计算缺口位置 2 3 模拟人工移动 2 3 1 直接根据距离移动 2 3 2 牛
  • Linux抓包(wireshark+tcpdump)

    文章目录 一 Wireshark 1 安装wireshark工具 2 打开Wireshark 3 Wireshark基本使用 4 抓包信息 1 抓ping程序包 请求信息 响应信息 ARP协议 2 抓TCP三次握手 四次挥手 三次握手 四次
  • 若依源码解析:代码生成ruoyi-generator

    文章目录 摘要 代码生成器的使用 数据库连接配置 数据库表设计 代码生成器配置 修改mybatis别名配置 增加对com cyl包名的识别 修改mybatis的mapper扫描包路径 代码生成 代码输出 模板配置 代码生成器原理 模板引擎
  • sentinel源码流程图

    最近上海刮台风 在家画了sentinel的源码流程图 如有不对请指出 如需转载请标明出处
  • Java 数据库连接池、线程池和对象池总结

    一 Java数据库连接池总结 数据库连接池的实现及原理 内容摘要 对于一个复杂的数据库应用 频繁的建立 关闭连接 会极大的减低系统的性能 因为对于连接的使用成了系统性能的瓶颈 有一个很著名的设计模式 资源池 该模式正是为了解决资源频繁分配
  • IDEA的下载安装及配置Tomcat

    IDEA的下载安装及配置tomcat 1 首先是下载及安装 IDEA的官方网站提供了两种安装包 一种是旗舰版 既Ultimate版和Community版 如上图 左边是旗舰版的 需要付费 但是可以破解 右边是社区版 是免费的 但是提供的功能
  • Merge sort(归并排序) -- 分治

    基本思路 确定分界点 mid l r 2 递归排序left right 将步骤2中排序好的left right数组进行归并 合二为一 C 代码实现 void merge sort int q int l int r if l gt r re
  • SQL-lab 38~53

    less38 本关卡为堆叠注入 注入语句为 id 1 CREATE DATABASE sq default charset utf8 查询用户名和密码 并创建数据库 数据库创建成功 说明两条语句都执行了 less39 45关 这几关与上一关
  • 第一次动手构建 Linux 内核

    目录 背景 机器参数 参考链接 操作流程 步骤1 下载 Linux 内核源码 步骤 2 解压源码 步骤 3 下载所需软件包 步骤 4 内核配置 步骤 5 开始构建 步骤 5 1 make 步骤 5 2 make INSTALL MOD ST
  • 多线程作业及答案

    多线程作业 一 填空题 1 处于运行状态的线程在某些情况下 如执行了sleep 睡眠 方法 或等待I O设备等资源 将让出CPU并暂时停止自己的运行 进入 状态 2 处于新建状态的线程被启动后 将进入线程队列排队等待CPU 此时它已具备了运
  • myeclipse无法打开工作空间

    现象 打开myeclipse工作空间时进度条不动 解决方式 找到工作空间的文件目录 如 D work 打开D work metadata plugins org eclipse core resources projects 目录 查找近期
  • Mysql入门到精通-快速插入1000万条数据(转)

    创建MyISAM模式表方便批量跑数据 CREATE TABLE logs1 id int 11 NOT NULL AUTO INCREMENT logtype varchar 255 DEFAULT NULL logurl varchar
  • SIFT解析(二)特征点位置确定

    最近微博上有人发起投票那篇论文是自己最受益匪浅的论文 不少人说是lowe的这篇介绍SIFT的论文 确实 在图像特征识别领域 SIFT的出现是具有重大意义的 SIFT特征以其稳定的存在 较高的区分度推进了诸多领域的发展 比如识别和配准 上一篇
  • 3月打卡活动第20天 面试题第40题:最小的k个数(简单)

    3月打卡活动第20天 面试题第40题 最小的k个数 简单 题目 输入整数数组 arr 找出其中最小的 k 个数 例如 输入4 5 1 6 2 7 3 8这8个数字 则最小的4个数字是1 2 3 4 解题思路 排序 取前k个值 class S