题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
Solutions
1. 二分查找的方式
最直接的方法就是遍历每一行,每一行作为一个二分查找的子问题来求解:
# -*- coding:utf-8 -*-
class Solution:
def binary_tree_margins(self, array, l, r, target):
if l == r:
return False
mid_idx = int((l + r) / 2)
if array[mid_idx] == target:
return True
elif array[mid_idx] > target:
return self.binary_tree_margins(array, l, mid_idx - 1, target)
else:
return self.binary_tree_margins(array, mid_idx + 1, r, target)
def binary_tree_no_margins(self, array, target):
if len(array) == 0:
return False
mid_idx = len(array) / 2
if array[mid_idx] == target:
return True
elif array[mid_idx] > target:
return self.binary_tree_no_margins(array[:mid_idx], target)
else:
return self.binary_tree_no_margins(array[mid_idx + 1:], target)
def binary_tree(self, array, l, r, n_cols):
if l == r:
return False
mid_idx = int((l + r) / 2)
row_idx = int(mid_idx / n_cols)
col_idx = mid_idx % n_cols
print mid_idx, row_idx, col_idx, array[row_idx][col_idx]
if array[row_idx][col_idx] == target:
print '='
return True
if array[row_idx][col_idx] > target:
print '>', l, mid_idx
return self.binary_tree(array, l, mid_idx - 1, n_cols)
if array[row_idx][col_idx] < target:
print '<', mid_idx, r
return self.binary_tree(array, mid_idx + 1, r, n_cols)
# array 二维列表
def Find(self, target, array):
n_rows = len(array)
n_cols = len(array[0])
res_bool = False
for r in range(n_rows):
res_bool = res_bool or self.binary_tree_no_margins(array[r][:], target)
return res_bool
if __name__ == '__main__':
s = Solution()
array = [[1,2,3,4],[5,6,7,12],[13,17,21,23],[26,28,211,215]]
target = 7
print s.Find(target, array)
# 运行时间:312ms
# 占用内存:5752k
虽然这个办法能够解决,但是效率比较低,$O(n\log n)$ 没有利用到每一列其实也是有序的。
2. 优化解法
# -*- coding:utf-8 -*-
class Solution:
# array 二维列表
def Find(self, target, array):
# write code here
n_rows = len(array)
n_cols = len(array[0])
j = n_cols - 1
i = 0
while j >= 0 and i < n_rows:
if array[i][j] == target:
return True
elif array[i][j] > target:
j -= 1
else:
i += 1
return False
# 运行时间:221ms
# 占用内存:5624k