博客
关于我
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/

    你可能感兴趣的文章
    oracle 限制用户并行,insert /*parallel */ 到不同用户,并行起不来的问题
    查看>>
    oracle--用户,权限,角色的管理
    查看>>
    Oracle-定时任务-JOB
    查看>>
    oracle.dataaccess 连接池,asp.net使用Oracle.DataAccess.dll连接Oracle
    查看>>
    oracle00205报错,Oracle控制文件损坏报错场景
    查看>>
    Oracle10g EM乱码之快速解决
    查看>>
    Oracle10g下载地址--多平台下的32位和64位
    查看>>
    Oracle10g安装了11g的ODAC后,PL/SQL连接提示TNS:无法解析指定的连接标识符
    查看>>
    oracle11g dataguard物理备库搭建(关闭主库cp数据文件到备库)
    查看>>
    Oracle11G基本操作
    查看>>
    Oracle11g服务详细介绍及哪些服务是必须开启的?
    查看>>
    Oracle11g静默安装dbca,netca报错处理--直接跟换操作系统
    查看>>
    oracle12安装软件后安装数据库,然后需要自己配置监听
    查看>>
    Oracle——08PL/SQL简介,基本程序结构和语句
    查看>>
    Oracle——distinct的用法
    查看>>
    Oracle、MySQL、SQL Server架构大对比
    查看>>
    oracle下的OVER(PARTITION BY)函数介绍
    查看>>
    Oracle中DATE数据相减问题
    查看>>
    Oracle中merge into的使用
    查看>>
    oracle中sql查询上月、本月、上周、本周、昨天、今天的数据!
    查看>>