C++ 中的二维矩阵搜索


假设我们需要编写一个高效的算法来在一个 m x n 矩阵中搜索一个值。这个矩阵有一些如下属性:

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

所以如果矩阵如下:

1357
10111620
23303450
53627898

如果目标值为 16,则输出为 True。

让我们看看步骤:

  • n := 行数,如果 n 为 0,则返回 false,m := 列数,如果 m 为 0,则返回 false
  • low := 0 且 high := n – 1
  • 当 low < high
    • mid := low + (high – low + 1)/2
    • 如果 mat[mid, 0] <= target,则 low := mid,否则 high := mid – 1
  • rlow := 0 且 rhigh := m – 1 且 ans := 0
  • 当 rlow <= rhigh
    • mid := rlow + (rhigh - rlow)/2
    • 如果 mat[low, mid] = target,则 ans := 1,并退出循环
    • 否则,当 matrix[low, mid] < target 时,则 rlow := mid + 1
    • 否则 rhigh := mid – 1
  • 返回 ans

让我们看看下面的实现来更好地理解:

示例

 在线演示

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
   public:
   bool searchMatrix(vector<vector<int>>& matrix, int target) {
      lli n,m;
      n = matrix.size();
      if(!n)return false;
      m = matrix[0].size();
      if(!m)return false;
      lli low = 0, high = n-1;
      while(low<high){
         lli mid = low + ( high - low +1)/2;
         if(matrix[mid][0]<=target)low = mid;
         else high = mid -1;
      }
      lli rlow = 0, rhigh = m-1;
      lli ans = 0;
      while(rlow<=rhigh){
         lli mid = rlow+(rhigh - rlow)/2;
         if(matrix[low][mid] == target){
            ans =1;
            break;
         }else if(matrix[low][mid]<target)rlow=mid+1;
         else rhigh= mid-1;
      }
      return ans;
   }
};
main(){
   Solution ob;
   vector<vector<int>> v = {{1,3,5,7},{10,11,16,20},{23,30,34,50},{53,62,78,98}};
   cout << ob.searchMatrix(v, 16);
}

输入

[[1,3,5,7],[10,11,16,20],[23,30,34,50],[53,62,78,98]]
16

输出

1

更新于: 2020年5月4日

335 次查看

启动你的 职业生涯

通过完成课程获得认证

开始
广告