首页 > 代码库 > Search a 2D Matrix

Search a 2D Matrix

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[  [1,   3,  5,  7],  [10, 11, 16, 20],  [23, 30, 34, 50]]

Given target = 3, return true.

思路:将矩阵看做行优先的有序数组,直接使用二分查找即可。

 1 class Solution { 2 public: 3     bool searchMatrix( vector<vector<int>> &matrix, int target ) { 4         if( matrix.empty() ) { return false; } 5         int rows = matrix.size(), cols = matrix[0].size(); 6         int start = 0, end = rows*cols-1; 7         while( start <= end ) { 8             int middle = ( start + end ) / 2; 9             if( matrix[middle/cols][middle%cols] < target ) {10                 start = middle + 1;11             } else if( matrix[middle/cols][middle%cols] > target ) {12                 end = middle - 1;13             } else {14                 return true;15             }16         }17         return false;18     }19 };

每次选取矩阵右上角的元素与target进行比较:若matrix[0][cols-1]<target,则可排除第cols-1列;若matrix[0][cols-1]>target,则可排除第0行。

 1 class Solution { 2 public: 3     bool searchMatrix( vector<vector<int>> &matrix, int target ) { 4         if( matrix.empty() ) { return false; } 5         int rows = matrix.size(), cols = matrix[0].size(); 6         int i = 0, j = cols - 1; 7         while( i < rows && j >= 0 ) { 8             if( matrix[i][j] == target ) { return true; } 9             if( matrix[i][j] < target ) {10                 ++i;11             } else {12                 --j;13             }14         }15         return false;16     }17 };

 

Search a 2D Matrix