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

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

  • 1. 题目描述
  • 2.详细题解
  • 3.代码实现
    • 3.1 Python
    • 3.2 Java

1. 题目描述

题目中转:215. 数组中的第K个最大元素
在这里插入图片描述

2.详细题解

    快速排序算法在每一轮排序中,随机选择一个数字 x x x,根据与 x x x的大小关系将要排序的数据分成独立的两个部分,其中一部分的所有数据都比 x x x小(不比 x x x大),另外一部分的所有数据比 x x x要大(不比 x x x小),此时一定可以确定 x x x的位置为 m i d mid mid,若该位置 m i d mid mid即为要查找的第 k k k元素,则已经找到答案,而不用关心左右两个区间中的数字是否有序。
  具体的,在实现过程中,若该位置 m i d mid mid大于 k k k,说明 k k k在左区间,则递归左区间,否则递归右区间。
  该题代码开发工作量略大,主要是边界问题的处理具体。在Python方法一中忽略了子区间仅为两个元素的情况,故造成错误;Python方法二和Java方法一为同一种算法代码实现,提交均为超出时间限制,未通过测试案例均为同一个,根本原因在于数组中存在大量的相同元素时,划分数组时未等分,以致于递归迭代深度太深,例如对于数组 [ 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ] [1,1,1,1,1,1,1,1] [1,1,1,1,1,1,1,1],根据;Python方法二和Java方法一,初始化 l = 0 , r = 7 l=0,r=7 l=0,r=7,第一次划分结果为 i = 7 , j = 0 i=7,j=0 i=7,j=0,以 j = 0 j=0 j=0划分,对于测试未通过的案例,达到10万级的数组长度,且几乎所有数字均为 1 1 1,即为一个极端案例。【该题leetcode的官方题解非常清晰,建议仔细阅读。】

3.代码实现

3.1 Python

Python方法一:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        n = len(nums)
        return self.quickSelect(nums, 0, n-1, n-k)

    def quickSelect(self, nums, l, r, k):
        i, j = l+1, r
        while i < j:
            while i < r and nums[i] <= nums[l]:
                i += 1
            while j > l and nums[j] >= nums[l]:
                j -= 1
            if i>=j:
                break
            nums[i], nums[j] = nums[j], nums[i]
        nums[l], nums[j] = nums[j], nums[l]
        if k == j:
            return nums[j]
        elif k < j:
            return self.quickSelect(nums, l, j-1, k)
        else:
            return self.quickSelect(nums, j+1, r, k)

在这里插入图片描述
Python方法二:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        n = len(nums)
        return self.quickSelect(nums, 0, n-1, n-k)

    def quickSelect(self, nums, l, r, k):
        i, j = l+1, r
        while l < r:
            while i < r and nums[i] <= nums[l]:
                i += 1
            while j > l and nums[j] >= nums[l]:
                j -= 1
            if i>=j: 
                break
            nums[i], nums[j] = nums[j], nums[i]
        nums[l], nums[j] = nums[j], nums[l]
        if k == j:
            return nums[j]
        elif k < j:
            return self.quickSelect(nums, l, j-1, k)
        else:
            return self.quickSelect(nums, j+1, r, k)

在这里插入图片描述
Python方法三:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        n = len(nums)
        return self.quickSelect(nums, 0, n-1, n-k)

    def quickSelect(self, nums, l, r, k):
        if l == r:
            return nums[k]
        i, j, key = l-1, r+1, nums[l]
        while i < j:
            i += 1
            while nums[i] < key:
                i += 1
            j -= 1
            while nums[j] > key:
                j -= 1
            if i < j: 
                nums[i], nums[j] = nums[j], nums[i]

        if k <= j:
            return self.quickSelect(nums, l, j, k)
        else:
            return self.quickSelect(nums, j+1, r, k)

在这里插入图片描述

3.2 Java

Java方法一:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int n = nums.length;
        return quickSelect(nums, 0, n-1, n-k);

    }
    public int quickSelect(int[] nums, int l, int r, int k){
        int i = l+1, j = r;
        while (l < r){
            while (i < r && nums[i] <= nums[l]){i++;}
            while (j > l && nums[j] >= nums[l]){j--;}
            if (i>=j){break;}
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
        int tmp = nums[l];
        nums[l] = nums[j];
        nums[j] = tmp;
        if (j==k){return nums[j];}
        else if (k < j){return quickSelect(nums, l, j-1, k);}
        else{return quickSelect(nums, j+1, r, k);}
    }
}   

在这里插入图片描述
Java方法二:

class Solution {
    public int findKthLargest(int[] nums, int k) {
        int n = nums.length;
        return quickSelect(nums, 0, n - 1, n - k);
    }
    public int quickSelect(int[] nums, int l, int r, int k) {
        if (l == r) return nums[k];
        int key = nums[l], i = l - 1, j = r + 1;
        while (i < j) {
            do i++; while (nums[i] < key);
            do j--; while (nums[j] > key);
            if (i < j){
                int tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
            }
        }
        if (k <= j) return quickSelect(nums, l, j, k);
        else return quickSelect(nums, j + 1, r, k);
    }
}

在这里插入图片描述

  执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/776192.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(自适应手机端)保健品健康产品网站模板下载

(自适应手机端)保健品健康产品网站模板下载PbootCMS内核开发的网站模板&#xff0c;该模板适用于装修公司网站、装潢公司网站等企业&#xff0c;当然其他行业也可以做&#xff0c;只需要把文字图片换成其他行业的即可&#xff1b;自适应手机端&#xff0c;同一个后台&#xff0…

01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型

01–SpringAI接入大模型,chatgpt,Java接入人工智能大模型 文章目录 01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型一、准备工作&#xff1f;①&#xff1a;环境准备 二、创建一个springAI项目①&#xff1a;创建一个根项目②&#xff1a;创建一个SpringAI模块01.解决…

鸿蒙笔记导航栏,路由,还有axios

1.导航组件 导航栏位置可以调整&#xff0c;导航栏位置 Entry Component struct t1 {build() {Tabs(){TabContent() {Text(qwer)}.tabBar("首页")TabContent() {Text(发现内容)}.tabBar(发现)TabContent() {Text(我的内容)}.tabBar("我的")}// 做平板适配…

数据驱动制造业升级,免费可视化工具成关键

制造业作为国民经济的支柱产业&#xff0c;正经历着前所未有的变革。数据&#xff0c;作为这场变革的核心驱动力&#xff0c;其重要性不言而喻。然而&#xff0c;面对海量且复杂的数据&#xff0c;如何高效、直观地将其转化为有价值的洞察&#xff0c;成为了众多制造企业亟待解…

去中心化技术对云计算的潜在影响与应用

随着去中心化技术如区块链的发展&#xff0c;云计算领域也面临着新的变革与挑战。本文将深入探讨去中心化技术对云计算的潜在影响及其应用前景&#xff0c;从技术基础到实际案例&#xff0c;逐步揭示这一新兴领域的发展趋势与可能带来的革新。 1. 介绍&#xff1a;云计算的现状…

一个pdf分割成多个pdf,一个pdf分成多个pdf

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛欢迎。但有时候&#xff0c;我们可能需要将一个大的pdf文件分割成多个小文件&#xff0c;以便于分享、打印或编辑。今天&#xff0c;我就来教大家几种简单有效的方法&#xff0c;让你轻松实现pdf文件…

PHP源码:美容护理按摩预约系统(附管理端+前台)

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;预约系统 源码&#xff0c;支持二开&#xff0c;无加密。项目的内容可以是美容护理&#xff0c;按摩护理等&#xff0c;你也可以扩展。 预约下单大致流程&#xff1a; 客户登录下预约单&#xff0c…

亿发:信息化建设or面子工程?究竟什么才是真正的信息化解决方案

在现代企业的竞争中&#xff0c;信息化建设扮演着越来越重要的角色。信息化技术不仅是企业提升管理效率、优化运营模式的利器&#xff0c;更是企业在市场竞争中脱颖而出的关键。然而&#xff0c;许多企业在推进信息化的过程中&#xff0c;往往容易陷入“面子工程”的误区。那么…

echarts图表加载显示空白

数据请求了&#xff0c;图表加载显示空白 报错&#xff1a; Error: Initialize failed: invalid dom. at Object.init (echarts.js:2273:1) 方案 1. 通过this.$nexttick(()>{}) , 试过&#xff0c; 还是不行 2、把 this.lineChart2 this.$echarts.init(document.g…

关于汽车软件测试的几点想法

如果你有过汽车行业的从业经验&#xff0c;你就应该知道&#xff0c;过去汽车行业只做测试&#xff0c;而不做开发。汽车制造商的主要任务&#xff08;从工程角度看&#xff09;是将来自数百家供应商的数千个零部件组装在一起。考虑到现代软件的复杂性和客户的“挑剔”&#xf…

【JavaWeb程序设计】Web基础-JavaScript

目录 一、函数与事件的使用 1. 编写一个html页面&#xff0c;使用Javascript完成数字的平方计算。 1.1 运行截图 1.2 JS代码 1.3 HTML代码 2. 要求文本框中只能输入字母 2.1 运行截图 2.2 下载jquery-3.4.1并引用 2.3 JS代码 2.4 HTML代码 3. 在文本框分别输入两个…

pytest-rerunfailures:优化测试稳定性的失败重试工具

笔者在执行自动化测试用例时&#xff0c;会发现有时候用例失败并非代码问题&#xff0c;而是由于服务正在发版&#xff0c;导致请求失败&#xff0c;从而降低了自动化用例的稳定性&#xff0c;最后还要花时间定位到底是自身case的原因还是业务逻辑问题&#xff0c;还是其他原因…

SKM Power*Tools 10.0

SKM Power*Tools 10.0是功能强大的电气电力系统分析设计解决方案&#xff01;综合软件提供强大的功能和领先的技术&#xff0c;在检查、计算、负载分配、流量、瞬态稳定性等多个方面提供领先的支持&#xff0c;可对不同的安全设备、系统进行评估分析和比较&#xff0c;使用 Pow…

《安全行业大模型技术应用态势发展报告(2024)》

人工智能技术快速迭代发展&#xff0c;大模型应用场景不断拓展&#xff0c;随着安全行业对人工智能技术的应用程度日益加深&#xff0c;大模型在网络安全领域的应用潜力和挑战逐渐显现。安全行业大模型技术的应用实践不断涌现&#xff0c;其在威胁检测、风险评估和安全运营等方…

解决Vue3中路由页面跳转出现白屏,刷新页面之后展示正常的问题

遇到这个问题&#xff0c;首先需要检查根组件标签最外层是否包含了个最大的div盒子来包裹内容。如下图所示&#xff1a; 我的项目就是因为没有将两块内容放到一个大盒子里面&#xff0c;所以才会出现白屏的问题。然后我去查了相关的资料&#xff0c;了解到这个问题是Vue组件渲染…

improved-diffusion-main代码理解

目录 一、 TimestepEmbedSequential二、PyTorch之Checkpoint机制三、AttentionBlock四、use_scale_shift_norm 和nanoDiffusion-main相比&#xff0c;improved-diffusion-main代码是相似的&#xff0c;但有几个不是很好理解的地方记录一下。 一、 TimestepEmbedSequential 代码…

中国动物志(140卷)

中国动物志&#xff0c;共140卷&#xff0c;包括昆虫纲、鸟纲、兽纲、无脊椎动物、硬骨鱼纲等多类&#xff0c;是反映我国动物分类区系研究工作成果的系列专著&#xff0c;是研究物种多样性、探讨物种演化和系统发育的重要参考&#xff0c;是动物资源开发利用、有害物种控制、濒…

charles使用教程

安装与配置 下载链接&#xff1a;https://www.charlesproxy.com/download/ 进行移动端抓包&#xff1a; 电脑端配置&#xff1a; 关闭防火墙 Proxy–>勾选 macOS Proxy Proxy–>Proxy Setting–>填入代理端口8888–>勾选Enable transparent http proxying 安装c…

【pycharm】 Virtualenv创建venv报错

一、背景 在启动django项目时&#xff0c;需要创建venv环境&#xff0c;有时候能顺利创建成功&#xff0c;当python版本换成3.8时&#xff0c;会报错 ImportError: DLL load failed while importing _ssl: 找不到指定的模块。 二、原因和解决措施 之所以执行这个报错&#…

.NET下的开源OCR项目:解锁图片文字识别的新篇章

在数字化时代&#xff0c;从图片中高效准确地提取文字信息已成为众多应用场景的迫切需求。OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术正是满足这一需求的关键技术。对于.NET开发者而言&#xff0c;幸运的是&#xff0c;存在多个开…