当前位置: 首页 > news >正文

leetcode215.数组中的第k个最大元素

思路源于

7-2「力扣」第 215 题:数组中的第 K个最大元素

基于快速排序思路的一种求解,我们的问题是求解第k个最大的元素,那么也就是排序后数组下标索引在n-k的位置

快速排序中我们随机选择一个轴值,左边的元素都小于他,右边的元素都大于他,然后返回这个下标索引(分割点),如果这个分割点恰好是n-k那么这就是最终结果,如果分割点比n-k小那么说明答案应该在右边的区间,反之答案就在左边的区间

如果都没找到说明k肯定不合法直接返回-1

class Solution {
    private Random random = new Random();

    private int partition(int[] nums, int left, int right) {
        // 随机选择基准元素的索引
        int randomIndex = left + random.nextInt(right - left + 1);
        // 将随机选择的基准元素放到 left 位置
        swap(nums, randomIndex, left);

        while (left < right) {
            while (left < right && nums[left] <= nums[right]) {
                right--;
            }
            if (left < right) {
                swap(nums, left, right);
                left++;
            }
            while (left < right && nums[left] <= nums[right]) {
                left++;
            }
            if (left < right) {
                swap(nums, left, right);
                right--;
            }
        }
        return left;
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }

    public int findKthLargest(int[] nums, int k) {
        int target = nums.length - k;

        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int pivotPos = this.partition(nums, left, right);
            if (pivotPos == target) {
                return nums[pivotPos];
            } else if (pivotPos < target) {
                left = pivotPos + 1;
            } else {
                right = pivotPos - 1;
            }
        }
        return -1;
    }
}    

 

相关文章:

  • intel-xpu-backend-for-triton绕过pytorch直接调用Unified-Runtime
  • 小程序31-wxml语法-setData() 修改数据
  • RTC实时时钟M41T11M6F国产替代FRTC4111S
  • vue3如何批量设置每个vue页面的defineOptions的name
  • Web Workers 技术解析与应用
  • # 基于 OpenCV 的人脸识别实战:从基础到进阶
  • 贪心进阶学习笔记
  • Elasticsearch简介及索引库操作
  • 全新开源PHP轻量级活码管理系统|支持二维码动态更新与自动失效机制
  • 【力扣hot100题】(064)在排序数组中查找元素的第一个和最后一个位置
  • 【Tauri2】015——前端的事件、方法和invoke函数
  • Docker常用操作教程
  • java发送http请求
  • 数字化转型:重构生存逻辑,不止系统升级
  • AI面试实践手册|牛客网
  • Flutter 打包APK的几种方式
  • 架构思维: 全链路日志深度解析
  • 【LeetCode】在每个树行中找最大值(DFS 深度优先搜索)
  • QT6 C++视频播放器实现(基于QGraphicsVideo)
  • 数据结构----------顺序查找,折半查找和分块查找(java实现)
  • 网站建设的编程技术/站内关键词排名优化软件
  • 学3dmax做效果图的网站/蔡甸seo排名公司
  • 石景山网站建设推广/seo关键技术有哪些
  • 网站开发的实验心德/googleseo排名公司
  • 企业网站建设案例分析/网络营销的现状
  • 网站建站行业新闻/搜索引擎收录查询工具