首页 > 其他分享 >215. 数组中的第K个最大元素

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

时间:2023-06-06 21:12:05浏览次数:30  
标签:215 nums int 元素 right 数组 left

给定整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/kth-largest-element-in-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

可以想到在遍历的过程中动态维护前 k 个最大值。此时,可以利用优先队列来实现。

想要达到 O(n) 的时间复杂度,则可以想到快排。

快排的思想:随机取某段数组中间的某个位置,然后将该段数组中所有比该位置元素小的放左边,大的放右边。

由于本题只需要知道第 k 个大的数,即我们不需要把数组完全排序,只需要保证比第 k 个元素大的放左边,小的放右边即可。

class Solution {
    public int findKthLargest (int[] nums, int k) {
//        快排
        quickSelect(nums, k, 0, nums.length - 1);
        return nums[k - 1];
    }

    private void quickSelect (int[] nums, int k, int left, int right) {
//        随机取中间的一个数,以该位置为基准点。
        int index = (int) (Math.random() * (right - left)) + left;
        int target = nums[index];
        int i = left;
        int j = right;
//        避免 nums[right] 丢失
        nums[index] = nums[right];
//        将比 num[index] 大的数放左边,小的放右边。
        while (i < j) {
            while (i < j && nums[i] >= target) {
                i ++;
            }
            nums[j] = nums[i];
            while (i < j && nums[j] <= target) {
                j --;
            }
            nums[i] = nums[j];
        }
        nums[i] = target;

        if (i > k - 1) {
            quickSelect(nums, k, left, i - 1);
        } else if (i < k - 1) {
            quickSelect(nums, k, i + 1, right);
        }
    }

}

 

标签:215,nums,int,元素,right,数组,left
From: https://www.cnblogs.com/allWu/p/17461723.html

相关文章

  • 60 数组内交换头尾
    packagecom.fqs.test;importjava.util.Arrays;publicclasshello{publicstaticvoidmain(String[]args){//交换数组头尾交换//交换前12345//交换后54321int[]arr={1,2,3,4,5};inttemp=arr[0];for(int......
  • 57 动态初始化数组;求数组中的最大值
    packagecom.fqs.test;importjava.util.Arrays;publicclasshello{publicstaticvoidmain(String[]args){//动态初始化数组int[]arr=newint[3];for(inti=0;i<arr.length;i++){System.out.println(arr[i]);......
  • 56 数组遍历求和;找能被3整除的数
    packagecom.fqs.test;publicclasshello{publicstaticvoidmain(String[]args){//定义一个数组,存储12345求和int[]arr={1,2,3,4,5};intsum=0;for(inti=0;i<arr.length;i++){sum=sum+arr[i];}......
  • 55 打印数组
    packagecom.fqs.test;importjava.util.Arrays;importjava.util.Random;importjava.util.Scanner;publicclasshello{publicstaticvoidmain(String[]args){//需求程序自动生成一个1到100之间的随机数字A,键盘输入数B猜数字int[]arr={......
  • 合并数组与非合并数组 -- SystemVerilog
    合并型数组(packed):合并型数组可以实现连续的存储,赋值时不需要用 ’{}。 数组中,数据排列为{ b_pack[2], b_pack[1],b_pack[0]},其中每个b_pack为8个bit;bit是二值逻辑,每位bit只占据1位。故24位(8bit*3)只占据一个word(一般一个word为32bit)的存储空间。 非合并型数组......
  • 数组
        ......
  • 通过adb命令获取页面activity所有元素
    /***获取设备当前页面activity控件元素信息*@paramiDevice安卓设备信息*@return*/privateJSONArraygetDevicePageResource(IDeviceiDevice){longstartTime=System.currentTimeMillis();Stringcmd="adb-s"+......
  • 数组名和指针区别(转)
    指针和数组名的共同特点是都是用来指代一个地址的。不同的是:1、指针是需要占用内存空间来存储地址的;数组名则更像是一个立即数或者常数。你可以修改指针指向的内容,但你绝对无法改变数组名的指向。2、数组和指针对于sizeof来说是不同的,指针变量占用的空间通常等于当前CPU的最大......
  • 一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数...
    一个整数数组里面,除了两个数之外,其他的数字都出现了两次,写一个程序找出这两个数,要求算法的时间复杂度为O(n). n为数组的长度。  程序代码如下: //取二进制中首个为1的位置intfindFirstOne(intvalue){intpos=0;while((value&1)!=1){value=value>>1;pos++;......
  • python+uiautomator2+atx,未开启底部导航栏会存在元素不一致
    如果在同一个安卓手机上,一个应用程序开启了底部导航栏而另一个未开启,在UI自动化测试中,这可能会导致元素在两个应用程序之间的定位方式有所不同。因为不同的应用程序可能会使用不同的布局和元素渲染方式。如果在未开启导航栏的应用程序中无法找到元素,则需要确保您的locator与该应......