【Hot100】LeetCode—215. 数组中的第K个最大元素

目录

  • [1- 思路](#1- 思路)
  • [2- 实现](#2- 实现)
    • [⭐++215. 数组中的第K个最大元素++------题解思路](#⭐215. 数组中的第K个最大元素——题解思路)
  • [3- ACM实现](#3- ACM实现)


1- 思路

快速选择

  • 第 k 大的元素的数组下标: int target = nums.length - k

1- 根据 partition 分割的区间来判断当前处理方式

  • 如果返回的 int 等于 target 说明找到了,直接返回
  • 如果返回的 int 小于 target 说明要在当前区间的右侧寻找,也就是 [pivotIndex+1,right]
  • 如果返回的 int 大于 target 说明要在当前区间的左侧寻找,也就是 [left,pivotIndex-1]

2- 实现 partition 随机选取一个 pivotIndex 分割区间

  • 2-1 随机选择一个下标
  • 2-2 交换 left 和 随机下标
  • 2-3 将随机下标的元素值设置为 pivot
  • 2-4 定义 lege 下标 使用 while(true)
    • 使得 le 指向的元素始终小于 pivot
    • 使得 ge 指向的元素始终大于 pivot

2- 实现

⭐++215. 数组中的第K个最大元素++------题解思路

java 复制代码
import java.util.Random;
class Solution {


    static Random random = new Random(System.currentTimeMillis());
    public int findKthLargest(int[] nums,int k){
        return quickSelect(nums,0,nums.length-1,nums.length-k);

    }

    public int quickSelect(int[] nums,int left,int right,int kIndex){
        if(right==left){
            return nums[left];
        }
        //
        int pivotIndex = partition(nums,left,right);

        if(pivotIndex == kIndex){
            return nums[kIndex];
        }else if( pivotIndex>kIndex){
            return quickSelect(nums,left,pivotIndex-1,kIndex);
        }else{
            return quickSelect(nums,pivotIndex+1,right,kIndex);
        }
    }

    public int partition(int[] nums,int left,int right){
        int randomIndex = left + random.nextInt(right-left+1);
        swap(nums,left,randomIndex);

        int mid = nums[left];
        int le = left+1;
        int ge = right;
        while(true){
            while(le<=ge && nums[le] < mid){
                le++;
            }
            while(le<=ge && nums[ge] > mid){
                ge--;
            }
            if(le>=ge){
                break;
            }
            swap(nums,le,ge);
            le++;
            ge--;
        }
        swap(nums,left,ge);
        return ge;
    }

    public void swap(int[] nums,int left,int right){
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }


}

3- ACM实现

java 复制代码
public class kthNums {

    static Random random = new Random(System.currentTimeMillis());
    public static int findK(int[] nums,int k){
        // 快速选择 ,传四个参数
        return quickSelect(nums,0,nums.length-1,nums.length-k);

    }

    public static int quickSelect(int[] nums,int left,int right,int kIndex){
        if(right==left){
            return nums[left];
        }
        //
        int pivotIndex = partition(nums,left,right);

        if(pivotIndex == kIndex){
            return nums[kIndex];
        }else if( pivotIndex>kIndex){
            return quickSelect(nums,left,pivotIndex-1,kIndex);
        }else{
            return quickSelect(nums,pivotIndex+1,right,kIndex);
        }
    }

    public static int partition(int[] nums,int left,int right){
        int randomIndex = left + random.nextInt(right-left+1);
        swap(nums,left,randomIndex);

        int mid = nums[left];
        int le = left+1;
        int ge = right;
        while(true){
            while(le<=ge && nums[le] < mid){
                le++;
            }
            while(le<=ge && nums[ge] > mid){
                ge--;
            }
            if(le>=ge){
                break;
            }
            swap(nums,le,ge);
            le++;
            ge--;
        }
        swap(nums,left,ge);
        return ge;
    }

    public static void swap(int[] nums,int left,int right){
        int tmp = nums[left];
        nums[left] = nums[right];
        nums[right] = tmp;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        String[] parts = input.split(" ");
        int[] nums = new int[parts.length];
        for(int i = 0 ; i < nums.length ; i++){
            nums[i] = Integer.parseInt(parts[i]);
        }
        System.out.println("输入K");
        int k = sc.nextInt();
        System.out.println("结果是"+findK(nums,k));

    }
}
相关推荐
小青龙emmm11 分钟前
2025级C语言第四次周测题解
c语言·开发语言·算法
树在风中摇曳21 分钟前
【牛客排序题详解】归并排序 & 快速排序深度解析(含 C 语言完整实现)
c语言·开发语言·算法
minji...25 分钟前
算法---模拟/高精度/枚举
数据结构·c++·算法·高精度·模拟·枚举
执笔论英雄1 小时前
【大模型训练】forward_backward_func返回多个micro batch 损失
开发语言·算法·batch
草莓熊Lotso2 小时前
《算法闯关指南:优选算法--模拟》--41.Z 字形变换,42.外观数列
开发语言·c++·算法
啊吧怪不啊吧2 小时前
算法王冠上的明珠——动态规划之斐波那契数列问题
大数据·算法·动态规划
无敌最俊朗@9 小时前
力扣hot100-206反转链表
算法·leetcode·链表
Kuo-Teng9 小时前
LeetCode 279: Perfect Squares
java·数据结构·算法·leetcode·职场和发展
王哈哈^_^9 小时前
YOLO11实例分割训练任务——从构建数据集到训练的完整教程
人工智能·深度学习·算法·yolo·目标检测·机器学习·计算机视觉
檐下翻书17310 小时前
从入门到精通:流程图制作学习路径规划
论文阅读·人工智能·学习·算法·流程图·论文笔记