这题是典型的运用堆和2分的题目。首先建立一个k大小的堆,然后用2分查找的方法每次向堆里面插入一个数据,将最后一个数据pop出去,一直保持堆的大小为k,这样的话就ok了,最后返回堆的最后一个数据。所用时间为nlogk。
但是仔细观察发现,如果A点被发现比堆里最后一个元素大,那么图中小正方形里的数据肯定都比堆的最后一个数据大,所以就不用比较了,要比较的是大的正方形减去小正方形的部分。
class Solution(object):
def BinerySort(self, list1, element, left, right):
if element <= list1[left]:
list1.insert(left, element)
elif element >= list1[right]:
list1.insert(right + 1, element)
else:
if element == list1[(left + right) / 2]:
list1.insert((left + right) / 2, element)
elif element > list1[(left + right) / 2]:
self.BinerySort(list1, element, (left + right) / 2 + 1, right)
else:
self.BinerySort(list1, element, left, (left + right) / 2 - 1)
def kthSmallest(self, matrix, k):
"""
:type matrix: List[List[int]]
:type k: int
:rtype: int
"""
if k == 1:
return matrix[0][0]
if k == len(matrix) ** 2:
return matrix[-1][-1]
list1 = []
symbol = True
for i in xrange(len(matrix)):
for j in xrange(len(matrix)):
if len(list1) == k and symbol:
list1.sort()
symbol = False
if len(list1) == k:
if matrix[i][j] >= list1[-1]:
for m in xrange(i + 1, len(matrix)):
for n in xrange(j):
if matrix[m][n] < list1[-1]:
self.BinerySort(list1, matrix[m][n], 0, k - 1)
list1.pop()
return list1[-1]
self.BinerySort(list1, matrix[i][j], 0, k - 1)
list1.pop()
else:
list1.append(matrix[i][j])