Leetcode 378. 有序矩阵中第 K 小的元素

1.题目基本信息

1.1.题目描述

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。

请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

你必须找到一个内存复杂度优于 O(n^2) 的解决方案。

1.2.题目地址

https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/description

2.解题方法

2.1.解题思路

归并排序+小根堆

2.2.解题步骤

第一步,初始化小根堆,其中堆中每个元素为(矩阵元素值,行索引,列索引)。初始化将矩阵所有行的第一个元素的item压入堆中。

第二步,循环k次,每次循环弹出堆中的最小item,并将该item的右边的一个元素添加到小跟堆中(确保该item没有超过矩阵范围)。第k次循环弹出的元素值即为题解。

3.解题代码

Python代码

python 复制代码
import heapq

class Solution:
    # 归并排序+小根堆
    def kthSmallest(self, matrix: List[List[int]], k: int) -> int:
        length=len(matrix)
        # 第一步,初始化小根堆,其中堆中每个元素为(矩阵元素值,行索引,列索引)。初始化将矩阵所有行的第一个元素的item压入堆中。
        heap=[]
        for i in range(length):
            heapq.heappush(heap,(matrix[i][0],i,0))
        # 第二步,循环k次,每次循环弹出堆中的最小item,并将该item的右边的一个元素添加到小跟堆中(确保该item没有超过矩阵范围)。第k次循环弹出的元素值即为题解。
        result=0
        for j in range(k):
            item=heapq.heappop(heap)
            result=item[0]
            nextCol=item[2]+1
            if nextCol<length:
                heapq.heappush(heap,(matrix[item[1]][nextCol],item[1],nextCol))
        # print(result)
        return result

4.执行结果

相关推荐
智者知已应修善业18 分钟前
【51单片机8位数码管动态显示日期小数点风格】2023-11-13
c++·经验分享·笔记·算法·51单片机
智者知已应修善业18 分钟前
【51单片机有三个LED 分别第一个灯闪三下 再到第二个灯又闪三下 再到第三个灯又闪三下 就这样循环程序】2023-11-16
c++·经验分享·笔记·算法·51单片机
吃好睡好便好1 小时前
创建魔方矩阵和单位矩阵
开发语言·人工智能·学习·线性代数·matlab·矩阵
小L~~~2 小时前
基于贪心策略的混合遗传算法求解01背包问题
python·算法
有为少年2 小时前
深度隐式层 | 隐式函数与自动微分
人工智能·神经网络·线性代数·机器学习·矩阵
洛水水2 小时前
【力扣100题】53.最长回文子串
算法·leetcode·职场和发展
jieyucx2 小时前
Go 语言 sort 包详解:从基础排序到自定义排序(含底层原理+零基础看懂)
算法·golang·排序算法·sort
叁散3 小时前
ESP32 LCD1602显示实验报告
算法
过期动态3 小时前
【LeetCode 热题 100】盛最多水的容器
java·数据结构·spring boot·算法·leetcode·spring cloud·职场和发展