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

[算法] [leetcode-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 void swapArray(int[] nums, int i, int j) {
if (i == j || i > nums.length || i < 0 || j > nums.length || j < 0) {
return;
}
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}

    public int findKthLargest(int[] nums, int k) {
        if (k <= 0 && k > nums.length) {
            return -1;
        }
        int begin = 0;
        int end = nums.length - 1;
        // 注意此处是升序排列. 真正获取需要进行反转求下标.
        int endIndex = nums.length - k;
        while (begin <= end) {
            int randomNum = begin + new Random().nextInt(end - begin+1 );
            System.out.println(randomNum);
            int[] rangeArray = chessSort(nums, begin, end, randomNum);
            if (rangeArray[0] <= endIndex && rangeArray[1] >= endIndex) {
                return nums[endIndex];
            } else if (endIndex < rangeArray[0]) {
                end = rangeArray[0] - 1;
            } else if (endIndex > rangeArray[1]) {
                begin = rangeArray[1] + 1;
            }
        }
        return -1;
    }

    public int[] chessSort(int[] nums, int begin, int end, int k) {
        if (begin > end) {
            return new int[]{-1, -1};
        }
        if (begin == end) {
            return new int[]{begin, end};
        }
        int beginIndex = begin - 1;
        int endIndex = end + 1;
        int index = begin;
        int flagNum = nums[k];
        while (index < endIndex) {
            if (nums[index] == flagNum) {
                index++;
            } else if (nums[index] < flagNum) {
                // 扩展左边界
                beginIndex = beginIndex + 1;
                // 交换当前数字
                swapArray(nums, index, beginIndex);
                // 指标指向下一位
                index = index + 1;
            } else if (nums[index] > flagNum) {
                // 扩展有边界
                endIndex = endIndex - 1;
                // 交换
                swapArray(nums, index, endIndex);
                // 指标不动 注意: 当前数字还未进行比较
                index = index;
            }
        }
        return new int[]{beginIndex + 1, endIndex - 1};
    }
}

···


http://www.kler.cn/a/465148.html

相关文章:

  • C# 设计模式(结构型模式):桥接模式
  • Scala_【4】流程控制
  • 2025编程技术前沿:探索最新的开发工具与趋势
  • 数据去重与重复数据的高效处理策略
  • 从零开始RTSP协议的实时流媒体拉流(pull)的设计与实现(一)
  • 计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask
  • wx015基于springboot+vue+uniapp的经济新闻资讯的设计与实现
  • 虚拟电厂搭建指南:绿虫仿真设计软件的助力
  • 【MySQL】什么是事务?MVCC?
  • Ceph对象存储接口的路线
  • 直观解读 JuiceFS 的数据和元数据设计(一)
  • LWM2M---Wakaama源码对接华为云平台
  • 推荐几个 docker 镜像加速地址
  • 【Vue】Composition API 钩子
  • vim、watch、cp和mv
  • df.replace({‘b‘: r‘\s*(\.)\s*‘}, {‘b‘: r‘\1ty‘}, regex=True)
  • vue中的h
  • CES Asia 2025:科技盛宴引领未来,BESTAR声学创新备受瞩目
  • 时间关系推理:利用大型语言模型检测股票投资组合崩溃
  • FFmpeg 4.3 音视频-多路H265监控录放C++开发二十一.4,SDP协议分析
  • C++如何读取CSV文件
  • jQuery get 方法内操控vue变量(异步ajax请求方法中操控双向绑定的响应式变量)实现异步请求函数内完成变量的双向响应式绑定
  • ElasticSearch05-集群搭建
  • 大模型 Fine-Tuning 技术解析
  • 【LLM】一文了解 NLP 里程碑模型 BERT
  • 太速科技-638-基于 KU060的双路1Gsps 14bit AD采集 PCIe卡