首页 > 试题广场 >

矩阵第K小

[编程题]矩阵第K小
  • 热度指数:689 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一个 的矩阵,每行每列都是升序排列的,请你找到矩阵中第 K 小的元素

数据范围:
示例1

输入

[[1,2,3,4,5],[6,7,8,9,10],[11,12,13,14,15],[16,17,18,19,20],[21,22,23,24,25]],5

输出

5
示例2

输入

[[1,1,1],[1,1,1],[1,1,1]],5

输出

1
# -*- coding: utf-8 -*-


#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param matrix int整型二维数组
# @param k int整型
# @return int整型
#
class Solution:
    """
    题目:
        https://www.nowcoder.com/practice/c754e7a920614cba9b8b692ba9b20b5d?tpId=196&tqId=40447&rp=1&ru=/exam/oj&qru=/exam/oj&sourceUrl=%2Fexam%2Foj%3FjudgeStatus%3D3%26page%3D1%26pageSize%3D50%26search%3D%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D196&difficulty=undefined&judgeStatus=3&tags=&title=
    参考:
        大神:牛客278599503号
    算法:
        题目已知:矩阵行列均为n,每行、每列均按升序排序,寻找第k小的元素。我们知道最小元素为left = matrix[0][0],最大元素为right = matrix[-1][-1],我们在闭合区间[left, right]上,使用二分法,寻找满足条件的第k小元素。
        函数check(target):用于统计小于等于target的元素个数count(根据二维矩阵的升序性质,我们可以选择左下角或者右上角进行作为起点),返回值:count是否大于等于k
        当left < right时:
            取mid = left + (right - left) >> 1
            check(mid):
                如果满足条件,说明第k小元素在区间[left, mid]中
                否则:说明mid小了,第k小元素在区间[mid + 1, right]中
    复杂度:
        时间复杂度:O(logD * (n + n)) = O(nlogD), D为矩阵最大值与最小值的差值,check方法的复杂度为O(2n) = O(n)
        空间复杂度:O(1)
    """

    def KthinMatrix(self, matrix, k):
        # write code here
        def check(target):
            i, j = 0, n - 1 # 这里选择从右上角开始统计
            count = 0

            while i < n and j >= 0:
                if matrix[i][j] <= target:
                    count += j + 1
                    i += 1
                else:
                    j -= 1

            return count >= k

        n = len(matrix)

        left, right = matrix[0][0], matrix[-1][-1]
        while left < right:
            mid = left + (right - left) / 2
            if check(mid):
                right = mid
            else:
                left = mid + 1
        return left


if __name__ == "__main__":
    sol = Solution()

    matrix, k = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],
                 [11, 12, 13, 14, 15], [16, 17, 18, 19, 20],
                 [21, 22, 23, 24, 25]], 5

    # matrix, k = [[1, 1, 1], [1, 1, 1], [1, 1, 1]], 5

    # matrix, k = [[1, 2, 5], [3, 4, 6], [7, 8, 9]], 5

    res = sol.KthinMatrix(matrix, k)

    print res

发表于 2022-06-26 07:13:41 回复(0)

问题信息

难度:
1条回答 2271浏览

热门推荐

通过挑战的用户

查看代码