华为OD技术面试-有序数组第K最小值

背景

2024-03-15华为od 二面,记录结题过程

  1. 有序矩阵中第 K 小的元素 - 力扣(LeetCode) https://leetcode.cn/problems/kth-smallest-element-in-a-sorted-matrix/submissions/512483717/

题目

给你一个 n x n 矩阵 matrix ,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素。 请注意,它是 排序后 的第 k 小元素,而不是第 k 个 不同 的元素。

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

示例 1:

输入:matrix = [[1,5,9],[10,11,13],[12,13,15]], k = 8 输出:13

解释:矩阵中的元素为 [1,5,9,10,11,12,13,13,15],第 8 小元素是 13

分析

采用遍历的思路
这里有个特点

  • 如果已有第m小,则红色部分必须都已排好序,且连续
  • 且下一个 小的数,只能是 黄色部分
    在这里插入图片描述

结果

在这里插入图片描述

代码

class Solution(object):
    def kthSmallest(self, matrix, k):
        """
        :type matrix: List[List[int]]
        :type k: int
        :rtype: int
        """
        n = len(matrix)
        self.n = n
        self.matrix = matrix
        
        ikx = {}
        for i in range(n):
            ikx[i] = [i, -1]
        
        iix = [] # 当前遍历点
        ik = 0      # 当前第N小
        while True:
            ikx2 = self.get_maymin_iix(ikx)
            
            if len(ikx2)==1:
                iix = list(ikx2.values())[0][0]
            else:
                iix = min(ikx2.items(), key=lambda x:x[1][1])[1][0]
            ik += 1
            x, y = iix
            ikx[x][1] = y
            if ik ==k :
                return matrix[iix[0]][iix[1]]
        
    def get_maymin_iix(self, ikx):
        ikx2 = {}
        for i,point in ikx.items():
            x, y = point
            if y>=self.n-1:
                continue
            y = y+1
            if i>=1 and ikx[i-1][1]<y:
                continue
            ikx2[i] = [(x, y),self.matrix[x][y]]
        return ikx2

测试

matrix = [[1,5,9],[10,11,13],[12,13,15]]

c = {0: [(0, 1), 5], 1: [(1, 0), 10]}


c = Solution()

c.kthSmallest(matrix, 8)

相关推荐

  1. 华为OD技术面试-异或-2024手撕代码真题

    2024-04-12 06:58:03       32 阅读
  2. 华为OD技术面试-长回文串-2024手撕代码真题

    2024-04-12 06:58:03       36 阅读
  3. 华为OD试题之k长子串

    2024-04-12 06:58:03       34 阅读
  4. 华为OD机试题:字符串变换字符串

    2024-04-12 06:58:03       32 阅读
  5. 华为OD机试C++】求公倍数

    2024-04-12 06:58:03       40 阅读
  6. 华为OD机考题(HJ108 求公倍数)

    2024-04-12 06:58:03       24 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-12 06:58:03       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-12 06:58:03       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-12 06:58:03       87 阅读
  4. Python语言-面向对象

    2024-04-12 06:58:03       96 阅读

热门阅读

  1. c# sqlite导出导入数据表 作为sql文件

    2024-04-12 06:58:03       39 阅读
  2. 关于ceph osd auth keyring

    2024-04-12 06:58:03       187 阅读
  3. Ceph学习 -8.认证管理-用户基础

    2024-04-12 06:58:03       46 阅读
  4. 相似图片分类 [华为]【并查集】

    2024-04-12 06:58:03       46 阅读
  5. 【SpinalHDL】Scala编程中的var及val

    2024-04-12 06:58:03       201 阅读
  6. WebSocket

    2024-04-12 06:58:03       45 阅读
  7. js面试---ES6

    2024-04-12 06:58:03       130 阅读
  8. brpc: bthread使用

    2024-04-12 06:58:03       40 阅读