215数组中的第K个最大元素

这篇具有很好参考价值的文章主要介绍了215数组中的第K个最大元素。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

215数组中的第K个最大元素

题目描述

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5

示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4

提示:

  • 1 <= k <= nums.length <= 105
  • -104 <= nums[i] <= 104

方法一(小顶堆)

class Solution {
    public int findKthLargest(int[] nums, int k) {
        PriorityQueue<Integer> pq = new PriorityQueue<>(); // min heap
        for (int val : nums) {
            pq.add(val);
            if (pq.size() > k) {
                pq.poll();
            }
        }
        return pq.peek();
    }
}

在这个代码中,我们首先创建一个优先队列pq。然后,我们遍历数组nums,对于每个元素,我们将其添加到队列中。如果队列的大小大于k,我们就删除队列中的最小元素。最后,我们返回队列的头部元素,这就是第k个最大的元素。

这个算法的时间复杂度是O(n log k),因为我们需要对每个元素进行堆操作,堆操作的时间复杂度是O(log k)。虽然题目要求时间复杂度为O(n),但是这个算法在实际中的性能已经非常好了,因为log k通常远小于n。

方法二(快速选择)

class Solution {
    public void swap(int[] nums,int a,int b){
        int tem = nums[a];
        nums[a] = nums[b];
        nums[b] = tem;
    }
    public int getIndex(int[] nums,int left,int right){

        int m = (right+left) / 2 ;
        int n = nums[right];
        int p = left;
        for(int i = left;i<right;i++){
            if(nums[i] < n){
                swap(nums,p,i);
                p++;
            }
        }
        swap(nums,p,right);
        return p;
    }
    public int quickSelect(int[] nums,int left,int right,int k){
        if(right == left){
            return nums[left];
        }
        int index = getIndex(nums,left,right);
        if(index == k){
            return nums[index];
        }else if(index < k){
            return quickSelect(nums,index+1,right,k);
        }else{
            return quickSelect(nums,left,index-1,k);
        }
    }
    public int findKthLargest(int[] nums, int k) {
        return quickSelect(nums,0,nums.length-1,nums.length - k);
    }
}

快速选择是快速排序的一个优化,它在平均情况下的时间复杂度是O(n)。

在这个代码中,我们首先使用快速选择算法来找到第k个最大的元素。快速选择算法的基本思想是,我们选择一个枢轴元素,然后将数组分为两部分,一部分是小于枢轴的元素,另一部分是大于枢轴的元素。然后我们根据k和枢轴的位置,决定是在左边的部分还是右边的部分继续查找。如果k等于枢轴的位置,那么枢轴就是我们要找的元素。文章来源地址https://www.toymoban.com/news/detail-834659.html

到了这里,关于215数组中的第K个最大元素的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 老卫带你学---leetcode刷题(215. 数组中的第K个最大元素)

    给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 堆排序 对每个元素入堆,然后pop出来k-1个 这里需要注意,默认堆为最

    2024年02月07日
    浏览(9)
  • 面试热题(数组中的第K个最大元素)

    面试热题(数组中的第K个最大元素)

    给定整数数组  nums  和整数  k ,请返回数组中第  k  个最大的元素。 请注意,你需要找的是数组排序后的第  k  个最大的元素,而不是第  k  个不同的元素。        提到数组中最大元素,我们往往想到就是先给数组进行排序,然后取最大值,现在我们按照这个思路写一

    2024年02月13日
    浏览(6)
  • 数据结构:求一维数组中的最大值最小值

    数据结构:求一维数组中的最大值最小值

    思路: 对于一维数组中的元素,赋max,min的初值为数组的第一个元素,然后将数组中剩余的元素依次和max值最小值比较。 代码: 分析:该算法的最好、最坏和平均情况下的元素比较次数分别为n-1,2(n-1),3(n-1)/2 该算法的时间最主要花费在元素的比较上。最好情况是a中元素呈

    2024年02月07日
    浏览(19)
  • LeetCode 刷题 数据结构 数组 485 最大连续1的个数

    LeetCode 刷题 数据结构 数组 485 最大连续1的个数

    给定一个二进制数组  nums  , 计算其中最大连续  1  的个数。 示例 1: 示例 2: 提示: 1 = nums.length = 105 nums[i]  不是  0  就是  1.   参看bilibli视频-up主 爱学习的饲养员,讲解的很清晰。 手把手带你刷Leetcode力扣|各个击破数据结构和算法|大厂面试必备技能【已完结】-

    2024年02月15日
    浏览(35)
  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    Kadane\\\'s 算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。 算法的核心思想是通过迭代数组的每个元素,维护两个变量来跟踪局部最优解和全局最优解。 以下是Kadane’s算

    2024年03月22日
    浏览(15)
  • 数据结构 | 寻找二维数组的最大值和对应下标 | C语言代码

    题目:         本题目要求读入M(最大为10)行N(最大为15)列个元素,找出其中最大的元素,并输出其行列值。 输入格式:         输入在第一行中给出行数m和列数n。接下来输入m*n个整数。 输出格式:         输出最大值的行号,列号,值。 输入样例: 2 3 1 2 3 4 5 6 输

    2024年02月05日
    浏览(17)
  • 数据结构——顺序表——数组元素和与数字和的绝对差

    数据结构——顺序表——数组元素和与数字和的绝对差

    经验:要得到一个数的个位和十位,可以通过先模十取余,再除于十

    2024年04月12日
    浏览(7)
  • 【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解

    【数据结构】数组的顺序存储(1、2、3、n维数组的元素地址计算)|保姆级详解+图解

    作者: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:算法、数据结构、Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: 【数据结构】:该专栏专注于数据结构知识,持续更新,每一篇内容优质,浅显易懂,不失深度! 近期目标: 写好专栏

    2024年02月07日
    浏览(9)
  • 数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

    数据结构c语言版:顺序表oj题练习(原地移除元素、合并两个有序数组)

    在单数组里面历遍找val,如果是val,就删除。不是就跳过。 时间复杂度O(n^2),最坏情况每个都是val。相当于一个等差数列。 比如 下标0开始找,0不是,不动数组 下标1,1不是,不动数组 下标2,2是,删除元素,变成【0,1,2,3,0,4,2】 下标2,2是,删除元素,变成【0,

    2024年01月23日
    浏览(17)
  • leetcode: 2789. 合并数组中的最大元素

    给你一个下标从 0 开始、由正整数组成的数组  nums  。 你可以在数组上执行下述操作 任意 次: 选中一个同时满足  0 = i nums.length - 1  和  nums[i] = nums[i + 1]  的整数  i  。将元素  nums[i + 1]  替换为  nums[i] + nums[i + 1]  ,并从数组中删除元素  nums[i]  。 返回你可以从最

    2024年03月14日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包