赞
踩
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。
请注意,它是排序后的第k小元素,而不是第k个元素。
示例:
- matrix = [
- [ 1, 5, 9],
- [10, 11, 13],
- [12, 13, 15]
- ],
- k = 8,
-
- 返回 13。
说明:
你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 。
解题思路:看到这种有序(或者部分有序)的数组,一般考虑使用二分查找进行优化。开始时,左指针指向矩阵中最小元素,右指针指向矩阵中最大元素(注意:指针代表的是元素值,而不是位置),计算矩阵中小于等于左右指针中间值的元素个数c,然后通过比较c与k的值,进行左指针或者右指针的移动。重复上述过程直到l >= r.
Python3代码如下:
- class Solution(object):
- def kthSmallest(self, matrix, k):
- """
- :type matrix: List[List[int]]
- :type k: int
- :rtype: int
- """
- l = matrix[0][0]
- r = matrix[-1][-1]
- while l < r:
- mid = (l+r)//2
- c = sum(bisect.bisect_right(row,mid) for row in matrix)
- # bisect.bisect_right(row,mid)计算row中元素值<=mid的数量
- if c < k:
- l = mid + 1
- else:
- r = mid
- return l
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。