剑指offer:面试题3

面试题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'))

猜你喜欢

转载自blog.csdn.net/MaHilda/article/details/82846001
今日推荐