题目:

写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:

  • 每行中的整数从左到右是排序的。
  • 每行的第一个数大于上一行的最后一个整数。

给定一个值,搜索矩阵,判断该值是否在矩阵中。

样例:

考虑下列矩阵:
[[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]]
给出 target = 3,返回 true

思路:
给定一个数若他比矩阵中的某个数nums[i] [j]大,存在两种情况:这个数要么在nums[i] [j]的右侧,要么在nums[i] [j]的下侧。
给定一个数若他比矩阵中的某个数nums[i] [j]小,存在两种情况: 这个数要么在nums[i] [j]的左侧,要么在numsi的上侧。

但是:有种比二分法更清晰的:
左下角为起点(nums[len-1] [0]):那么比较起来比target小的数一定在上面,比target的大的数一定在右边。
右上角为起点(nums[0] [len-1]):那么比较起来比target小的数一定在左边,比target的大的数一定在下面。

参考答案:

class Solution {
public:
    /*
     * @param matrix: matrix, a list of lists of integers
     * @param target: An integer
     * @return: a boolean, indicate whether matrix contains target
     */
    bool searchMatrix(vector<vector<int>> &matrix, int target) {
        // write your code here
        /*求~二维矩阵的行与列
        vector<vector<int>> matrix
        int row=matrix.size();//行数
        int collor=matrix[0].size();//列数
        */
            int i = matrix.size()-1;//二维数组的名字代表二维数组第0行的首地址
            int j = 0;
            
            //从matrix[matrix.size()-1][0]开始迭代
            while (i >=0 && j <matrix[0].size()){
                if (target > matrix[i][j]){
                    j++;
                }
                else if (target < matrix[i][j]){
                    i--;
                }
                else{
                    return true;
                }
            }
            return false;        
    }
};

wydong
40 声望5 粉丝

wyd