LeetCode - 解题笔记 - 215 - Kth Largest Element in an Array

news/2024/5/19 5:10:42 标签: leetcode, 堆排序

Solution 1

本题有时间限制,也就是需要在线性时间内完成至少部分排序和查找工作。

第一个思路:不稳定的快速排序。提交了确实能过……

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N为输入数组的长度,排序的最佳实现可以达到线性复杂度,但是实际并不稳定。
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN),其中 N N N为输入数组的长度,快速排序过程中的函数递归调用之占用
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end(), greater<int>());
        int ans = nums[k - 1];
        
        return ans;
    }
};

Solution 2

第二个思路:堆排序(优先队列),在线性时间完成构建,对数时间内完成更新,因此我们可以快速建立一个堆,然后将堆顶元素删除k-1次,也可以在近似线性时间内得到结构。

为了方便确定最大值,因此使用大根堆。这次直接使用了C++内建的 make_heap 实现。

  • 时间复杂度: O ( N ) O(N) O(N),其中 N N N为输入数组的长度,本质上的时间复杂度是 O ( N + k log ⁡ N ) O(N + k \log N) O(N+klogN),但是本题的k取值似乎比较理想,因此优化到了忽略后项(能过就很迷)
  • 空间复杂度: O ( log ⁡ N ) O(\log N) O(logN),其中 N N N为输入数组的长度,建堆和更新时最大的函数低谷调用之占用
class Solution {
public:
    int findKthLargest(vector<int>& nums, int k) {
        // sort(nums.begin(), nums.end(), greater<int>());
        // int ans = nums[k - 1];
        
        make_heap(nums.begin(), nums.end());
        
        for (int i = 0; i < k - 1; i++) {
            pop_heap(nums.begin(), nums.end() - i);
        }
        
        int ans = nums[0];
        
        return ans;
    }
};

Solution 3

Solution 1的Python实现

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums = sorted(nums, reverse=True)
        ans = nums[k - 1]
        
        return ans

Solution 4

Solution 2的Python实现,本着想使用内建的heapify实现,但是只能处理小根堆

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        # nums = sorted(nums, reverse=True)
        # ans = nums[k - 1]

        def max_heapify(nums, pos):
            lson, rson = pos * 2 + 1, pos * 2 + 2
            largest = pos

            if lson < len(nums) and nums[largest] < nums[lson]:  
                largest = lson
            if rson < len(nums) and nums[largest] < nums[rson]:
                largest = rson

            if largest != pos:
                nums[largest], nums[pos] = nums[pos], nums[largest]
                max_heapify(nums, largest)

        def build_heap(nums):
            for pos in range(len(nums) // 2 - 1, -1, -1):
                max_heapify(nums, pos)
        
        build_heap(nums)
        for _ in range(k-1):
            nums[0], nums[-1] = nums[-1], nums[0]
            nums.pop() # 直接删除元素
            max_heapify(nums, 0)
            
        ans = nums[0]
        
        return ans

http://www.niftyadmin.cn/n/2631.html

相关文章

【0139】【libpq】postmaster收到startup packet启动数据包,并向libpq发送一个ACK(9)

文章目录 1. 概述2. libpq接收并处理ACK2.1 若因signal而导致poll()/select()失败,则会一直重试1. 概述 在【0137】【libpq】向postmaster发送 startup packet 数据包(7)和【0138】【libpq】发送任何在outBuffer中等待的数据(8)中,我们详细讲解了libpq是如何构建、填充s…

vue3 :一个实用的 vite + vue3 组件库脚手架工具

目录 1 组件库脚手架内容 2 组件库脚手架技术栈 3 使用说明 3.1 克隆代码到本地 3.2 安装依赖 3.3 本地开发 3.4 创建新组件 3.5 构建文档 3.6 构建 example 3.7 发布组件库 4 组件库命令说明 无论是 vue2 全家桶还是 vue3 vite TypeScript&#xff0c;组件库的使…

浅谈c/c++中main(),int main(),void main(),int main(void)四者之间的区别

一、主函数也是函数 首先我们要了解C/C中函数的定义&#xff0c;因为main函数也是函数&#xff0c;与其他函数的区别只是主函数是程序的主线而已&#xff0c;程序从它开始也在其中结束。一个函数由函数名、其前的类型标识符、其后小括号里声明的参数类型和参数名&#xff08;这…

c++的STL+string

目录 STL 什么是STL&#xff1f; STL有哪些版本&#xff1f; string string的使用&#xff1a; string st1 st2 "北山口镇"​编辑 string st3 "巩义市" string st4(10, *) cout << st1 << endl string st6(st2); string st7 st2; …

2022年了,软件测试已经饱和了?

这个年头找工作跟找对象一样难&#xff0c;咳咳&#xff0c;工作对象都木有&#xff0c;双重打击5555。 关于今年的就业市场&#xff0c;很多人表示特别惨淡&#xff0c;以往简历一投就有大批企业来联系&#xff0c;今年自己投递一大堆简历出去&#xff0c;可能全部都是已读不…

初识C++ (五)

作者&#xff1a;小萌新 专栏&#xff1a;初阶C 作者简介&#xff1a;大二学生 希望能和大家一起进步 内容简介&#xff1a;本文会简单的介绍auto关键字 还有nullptr关键字 加油&#xff01; 初识Cauto关键字c语言之前的用法C中的新用法auto使用细则auto不能使用的场景1. 未初…

公众号网课学习答案接口

公众号网课学习答案接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;…

爆破校园网的宽带

前提&#xff1a;学校的手机号前7位相同&#xff0c;宽带密码都是手机号后六位。仅供学习。 准备工作&#xff1a;电脑一台&#xff0c;把校园网的宽带水晶头插在电脑上&#xff0c; 步骤&#xff1a; winR输入Rasphone点击新建&#xff0c;宽带&#xff0c;输入宽带名称&am…