剑指Offer-二维数组中的查找

108 阅读1分钟

题目

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。

请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

数据范围 二维数组中元素个数范围 [0,1000][0,1000] 样例 输入数组:

[ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15] ]

如果输入查找数值为7,则返回true,

如果输入查找数值为5,则返回false。

解析

从二维数组最右上角的数字开始遍历,如果遍历到的数大于目标值,列值-1;如果遍历到的数小于目标值,行值+1;遍历到数等于目标值就直接返回True。若二维数据为空/某行为空就直接返回false

代码

C++

class Solution {
public:
    bool searchArray(vector<vector<int>> array, int target) {
        if (array.size() == 0 || array[0].size() == 0)
            return false;
        int i = 0, j = array[0].size() - 1;
        while (i < array.size() && j >= 0) {
            if (array[i][j] > target)
                j -- ;
            else if (array[i][j] < target)
                i ++ ;
            else
                return true;
        }
        return false;
    }
};

Python

class Solution(object):
    def searchArray(self, array, target):
        """
        :type array: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if len(array) == 0 or len(array[0]) == 0:
            return False
        i, j = 0, len(array[0]) - 1
        while i < len(array) and j >= 0:
            x = array[i][j]
            if x > target:
                j -= 1
            elif x < target:
                i += 1
            else:
                return True
        return False
        

GO

func searchArray(array [][]int, target int) bool {
    if (len(array) == 0) || (len(array[0]) == 0) {
        return false
    }
    
    i, j := 0, len(array[0]) - 1
    for i < len(array) && j >= 0 {
        x := array[i][j]
        if x == target {
            return true
        } else if x < target {
            i ++ 
        } else {
            j -- 
        }
    }
    
    return false
}