LeetCode 74. 搜索二维矩阵

LeetCode 74. 搜索二维矩阵_第1张图片
注意到该矩阵的一个特点:升序排列,因此二分法是最好的方法,当然也可以暴力查找,但时间复杂度过高。
首先找到需要在哪一行寻找target值,然后在这一行进行二分查找。
代码:

class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {
        if(matrix.size()==0||matrix[0].size()==0)    return false;
        int k;
        for(k=0;k<matrix.size();k++)
            if(matrix[k].back()>=target)
                break;
        if(k==matrix.size())    return false;
        if(binary_search(matrix[k].begin(), matrix[k].end(), target))//直接用的二分查找函数,没有写二分算法,偷个懒
            return true;
        else    return false;
    }
};

当然还有种更好的方法,就是将这个二维数组看一维数组,直接进行二分查找。
m x n 矩阵可以视为长度为m x n的有序数组。定义left=0,right=m*n-1,则mid=(left+right)/2,mid对应于原矩阵中的mid/n行和mid%n列,由此可以拿到中间值。
代码(官方题解):

class Solution {
  public:
  bool searchMatrix(vector<vector<int>>& matrix, int target) {
    int m = matrix.size();
    if (m == 0) return false;
    int n = matrix[0].size();

    // 二分查找
    int left = 0, right = m * n - 1;
    int pivotIdx, pivotElement;
    while (left <= right) {
      pivotIdx = (left + right) / 2;
      pivotElement = matrix[pivotIdx / n][pivotIdx % n];//中间值
      if (target == pivotElement) return true;
      else {
        if (target < pivotElement) right = pivotIdx - 1;
        else left = pivotIdx + 1;
      }
    }
    return false;
  }
};

你可能感兴趣的:(LEETCODE)