博客
关于我
LeetCode 378.有序矩阵中第K小的元素
阅读量:246 次
发布时间:2019-03-01

本文共 1954 字,大约阅读时间需要 6 分钟。

为了找到n x n矩阵中按升序排列的第k小的元素,我们可以采用最小堆来维护候选集合。每次从堆中取出最小的元素,然后将其右边和下边的元素加入候选集合,同时记录已经访问过的位置以避免重复处理。这种方法确保了每次处理的元素都是当前最小的,从而能够正确找到第k小的元素。

方法思路

  • 初始化优先队列:将矩阵的左上角元素(0,0)作为初始元素,加入优先队列。
  • 访问记录数组:创建一个二维数组visited,记录每个位置是否已经被访问过。
  • 处理优先队列:每次从优先队列中取出最小的元素,计数器加1。如果计数器等于k,则返回该元素的值。
  • 扩展相邻元素:对于取出的元素,扩展其右边和下边的位置。如果这些位置在矩阵范围内且未被访问过,则将它们加入优先队列,并标记为已访问。
  • 这种方法利用了优先队列按顺序处理元素的特点,确保每次处理的都是当前最小的元素,从而能够正确找到第k小的元素。

    解决代码

    import java.util.*;class Solution {    class Node {        int x;        int y;        int val;        Node(int x, int y, int val) {            this.x = x;            this.y = y;            this.val = val;        }    }    class NodeComparator implements Comparator
    { public int compare(Node a, Node b) { return a.val - b.val; } } public int kthSmallest(int[][] matrix, int k) { int n = matrix.length; if (n == 0) { return 0; } int[] cx = {0, 1}; int[] cy = {1, 0}; boolean[][] visited = new boolean[n][n]; PriorityQueue
    minHeap = new PriorityQueue<>(k, new NodeComparator()); Node start = new Node(0, 0, matrix[0][0]); minHeap.add(start); visited[0][0] = true; int count = 0; while (!minHeap.isEmpty()) { Node node = minHeap.poll(); count++; if (count == k) { return matrix[node.x][node.y]; } for (int i = 0; i < 2; i++) { int x = node.x + cx[i]; int y = node.y + cy[i]; if (x < n && y < n && !visited[x][y]) { visited[x][y] = true; minHeap.add(new Node(x, y, matrix[x][y])); } } } return 0; }}

    代码解释

    • Node类:用于存储当前处理的位置及其对应的矩阵值。
    • NodeComparator:用于比较节点的大小,确保优先队列按值顺序处理。
    • kthSmallest方法:主要逻辑函数,实现找到第k小的元素。
      • 初始化:将起点加入优先队列,并标记为已访问。
      • 优先队列处理:每次取出最小的元素,检查是否是第k小的。
      • 扩展相邻元素:处理当前元素的右边和下边位置,避免越界和重复访问。

    这种方法通过利用优先队列和访问记录,确保高效地找到矩阵中的第k小的元素。

    转载地址:http://rtvv.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 使用YOLO11实现区域内目标跟踪
    查看>>
    OpenCV与AI深度学习 | 使用YOLOv8做目标检测、实例分割和图像分类(包含实例操作代码)
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch实现Faster RCNN目标检测
    查看>>
    OpenCV与AI深度学习 | 基于PyTorch语义分割实现洪水识别(数据集 + 源码)
    查看>>
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    opencv图像分割2-GMM
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    Openlayers图文版实战,vue项目从0到1做基础配置
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(16/20):两个多边形的交集、差集、并集处理
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMMLab | S4模型详解:应对长序列建模的有效方法
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>