【leetcode刷题】33.最小的k个数——Java版

举报
一条coding 发表于 2021/10/19 00:59:20 2021/10/19
【摘要】 ⭐欢迎订阅《leetcode》专栏,每日一题,每天进步⭐ 先找到第k小的数,然后遍历一遍数组,把所有比k小的数加入结果集。然后用这个数填充结果集,使结果集大小等于k。 ——leetcode此题...

⭐欢迎订阅《leetcode》专栏,每日一题,每天进步⭐

先找到第k小的数,然后遍历一遍数组,把所有比k小的数加入结果集。然后用这个数填充结果集,使结果集大小等于k。

——leetcode此题热评

前言

哈喽,大家好,我是一条。

糊涂算法,难得糊涂

今天给大家推荐一位字节算法大佬,ACM队长——「英雄哪里出来」

Question

剑指 Offer 40. 最小的k个数

难度:简单

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

示例 1:

输入:arr = [3,2,1], k = 2
输出:[1,2] 或者 [2,1]

   
  
  • 1
  • 2

示例 2:

输入:arr = [0,1,2,1], k = 1
输出:[0]

   
  
  • 1
  • 2

限制:

0 <= k <= arr.length <= 10000
0 <= arr[i] <= 10000

Solution

该题是比较经典的TopK问题,解决的办法通常可以用快排、堆、二叉搜索树、计数排序。本文采用快速排序的方法,因为最高效。

快速排序:说白了就是给基准数据找其正确索引位置的过程.

根据快速排序原理,如果某次哨兵划分后 基准数正好是第 k+1小的数字 ,那么此时基准数左边的所有数字便是题目所求的 最小的 k 个数

Code

所有leetcode代码已同步至github

欢迎star

/**
 * @author yitiaoIT
 */
class Solution {
    public int[] getLeastNumbers(int[] arr, int k) {
        if (k >= arr.length) return arr;
        return quickSort(arr, k, 0, arr.length - 1);
    }
    private int[] quickSort(int[] arr, int k, int l, int r) {
        int i = l, j = r;
        while (i < j) {
            while (i < j && arr[j] >= arr[l]) j--;
            while (i < j && arr[i] <= arr[l]) i++;
            swap(arr, i, j);
        }
        swap(arr, i, l);
        if (i > k) return quickSort(arr, k, l, i - 1);
        if (i < k) return quickSort(arr, k, i + 1, r);
        return Arrays.copyOf(arr, k);
    }
    private void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

Result

复杂度分析

  • 时间复杂度:O(N)

image-20210817183939441

🌈寻宝

⭐今天是坚持刷题更文的第33/100天

⭐各位的点赞、关注、收藏、评论、订阅就是一条创作的最大动力

⭐更多算法题欢迎关注专栏《leetcode》

为了回馈各位粉丝,礼尚往来,给大家准备了一条多年积累下来的优质资源,包括 学习视频、面试资料、珍藏电子书等

大家可以先自己找一下获取方式,寻宝游戏现在开始。

如果实在找不到可以评论区留言或私信我领取,不过一定要先关注哦!不然无法发私信!

文章来源: blog.csdn.net,作者:一条coding,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/skylibiao/article/details/119763416

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。