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

    你可能感兴趣的文章
    NIO蔚来 面试——IP地址你了解多少?
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    NISP国家信息安全水平考试,收藏这一篇就够了
    查看>>
    NIS服务器的配置过程
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NiuShop开源商城系统 SQL注入漏洞复现
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 模型中的偏差和公平性检测
    查看>>
    Vue3.0 性能提升主要是通过哪几方面体现的?
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP三大特征抽取器:CNN、RNN与Transformer全面解析
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP度量指标BELU真的完美么?
    查看>>
    NLP的不同研究领域和最新发展的概述
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>