面试题3:二维数组中的查找:对于在一个每一行从左到右依次递增,每一列从上到下依次递增的二维数组查找一个元素,给出一个整数,判断它是否在数组中。
编译器:python3.5.2
编程环境:pycharm2018.1.2x64
思路:从左下角或者右上角开始比较
简单版本:
"""
查找方式从右上角开始查找
如果当前元素大于target, 左移一位继续查找
如果当前元素小于target, 下移一位继续查找
进行了简单的修改, 可以判定输入类型为字符的情况
"""
"""
查找方式从左下角开始查找
如果当前元素大于target, 上移一位继续查找
如果当前元素小于target, 右移一位继续查找
进行了简单的修改, 可以判定输入类型为字符的情况
"""
# 简单版本
def find_integer(matrix, num):
"""
:param matrix: [[]]
:param num: int
:return: bool
"""
if not matrix:
return False
rows, columns = len(matrix), len(matrix[0])
row, column = rows - 1, 0
while row >= 0 and column <= columns - 1:
if matrix[row][column] == num:
return True
elif matrix[row][column] > num:
row -= 1
else:
column += 1
return False
matrix = [[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15]]
matrix2 = []
print(find_integer(matrix,9))
print(find_integer(matrix2,9))
复杂版本:
"""
查找方式从右上角开始查找
如果当前元素大于target, 左移一位继续查找
如果当前元素小于target, 下移一位继续查找
进行了简单的修改, 可以判定输入类型为字符的情况
"""
"""
查找方式从左下角开始查找
如果当前元素大于target, 上移一位继续查找
如果当前元素小于target, 右移一位继续查找
进行了简单的修改, 可以判定输入类型为字符的情况
"""
"""
如果出现了array中既有字符串,又有数字,可能需要用到ord()函数,这里就不展开讨论了
"""
class Solution:
# array 二维列表
def Find(self, array, target):
# 判断数组是否为空
if array == []:
return False
raws = len(array)
columns = len(array[0])
# rawnum = len(array)
# colnum = len(array[0])
# 判断非法输入
# 可以换成 isinstance(target, (int, float)) 进行判断
if type(target) == float and type(array[0][0]) == int:
if int(target) == target:
return False
target = int(target)
elif type(target) == int and type(array[0][0]) == float:
target = float(target)
elif type(target) != type(array[0][0]): # 浮点数的相等判断问题需要特别注意, 一般都是判断两个数的差值是否小于一个特别小的数。这里不展开分析。
return False
column = columns - 1
raw = 0
# i = colnum - 1
# j = 0
while column >= 0 and raw < raws:
if array[raw][column] < target:
raw += 1
elif array[raw][column] > target:
column -= 1
else:
return True
return False
# 扩展, 输出数组中target的个数
def searchMatrix(self, matrix, target):
if matrix == None or len(matrix) == 0:
return 0
rows = len(matrix)
cols = len(matrix[0])
row, col = 0, cols - 1
count = 0
while row <= rows - 1 and col >= 0:
if matrix[row][col] > target:
col -= 1
elif matrix[row][col] < target:
row += 1
else:
count += 1
col -= 1
return count
array = [[1, 2, 8, 9],
[2, 4, 9, 12],
[4, 7, 10, 13],
[6, 8, 11, 15]]
array2 = []
array3 = [['a', 'b', 'c'],
['b', 'c', 'd']]
array4 = [[62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80],
[63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81],
[64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82],
[65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83],
[66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84],
[67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85]]
findtarget = Solution()
print(findtarget.Find(array, 10))
print(findtarget.Find(array, 30))
print(findtarget.Find(array, 13.0))
print(findtarget.Find(array, ''))
print(findtarget.Find(array2, 10))
print(findtarget.Find(array3, 'b'))