首页 > 代码库 > [LeetCode] Search a 2D Matrix
[LeetCode] 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
.
方法一:
首先要找到target处于的行,即在所有行的第一元素中找第一个比target小的元素。
// 注意,此处mid= (low+high+1)/2, 不是 mid = (low+high)/2
// 原因是此处要找的是第一个比target小的数,当array[mid] < target 时,low =mid,
// low仍然在我们的搜索范围之中,我们让high逐渐比较low。
// 举例,array={2,5}, low=0,high=1,target=3,
// 如果mid = (low+high)/2就会进入死循环,我们要让mid更接近high
// 如果要找的是第一个比target大的数,则使用mid = (low+high)/2,可以参考我自己写的upper_bound函数
1 class Solution 2 { 3 public: 4 bool searchMatrix(vector<vector<int> > &matrix, int target) 5 { 6 int rowNum = matrix.size(); 7 int colNum = matrix[0].size(); 8 9 int rowLow = 0;10 int rowHigh = rowNum - 1;11 12 // step1. 找到合适的行,找到比某行的第一个元素比target小的那一行13 while(rowLow < rowHigh)14 {15 // 注意,此处mid= (low+high+1)/2, 不是 mid = (low+high)/216 // 原因是此处要找的是第一个比target小的数,当array[mid] < target 时,low =mid,17 // low仍然在我们的搜索范围之中,我们让high逐渐比较low。18 // 举例,array={2,5}, low=0,high=1,target=3,19 // 如果mid = (low+high)/2就会进入死循环,我们要让mid更接近high20 // 如果要找的是第一个比target大的数,则使用mid = (low+high)/2,可以我的参考upper_bound函数21 int mid = (rowLow + rowHigh + 1)/2;22 if(matrix[mid][0] == target)23 return true;24 if(matrix[mid][0] < target)25 rowLow = mid ;26 else27 rowHigh = mid - 1 ;28 29 }30 31 //step2. 在行内二分32 int colLow = 0;33 int colHigh = colNum - 1;34 while(colLow <= colHigh)35 {36 int mid = (colLow + colHigh)/2;37 if(matrix[rowLow][mid] == target)38 return true;39 if(target > matrix[rowLow][mid] )40 colLow = mid + 1;41 else42 colHigh = mid - 1;43 44 }45 return false;46 47 48 }49 };
方法二:将matrxi当成一个有序的大数组,直接二分法,只是计算出的mid要换算成行和列
1 class Solution 2 { 3 public: 4 bool searchMatrix(vector<vector<int> > &matrix, int target) 5 { 6 7 int rowNum = matrix.size(); 8 int colNum = matrix[0].size(); 9 10 int low = 0;11 int high = rowNum * colNum - 1;12 int mid = 0;13 int row = 0, col = 0;14 15 while(low <= high)16 { 17 mid = (low + high) /2; 18 19 row = mid/colNum;20 col = mid%colNum;21 22 if(matrix[row][col] == target)23 return true;24 if(matrix[row][col] > target)25 high = mid -1; 26 else27 low = mid +1; 28 } 29 return false;30 31 } 32 };
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。