Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
For example,
Consider the following matrix:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
Given target = 3, return true.
我的解法:对列应用一次二分查找,对选中的行再一次二分查找。
class Solution { public: bool searchMatrix(vector<vector<int> > &matrix, int target) { int rownum = matrix.size(); int colnum = matrix[0].size(); int len=rownum; int half,mid,first=0; while(len>0){ half=len>>1; mid=first+half; if(matrix[mid][colnum-1]<target){ first=mid+1; len=len-half-1; } else len=half; }//while if(first==rownum) return false; return binarySearch(matrix[first], colnum, target); } bool binarySearch(vector<int> A, int length, int target){ int left = 0, right = length - 1, mid; while (left <= right){ mid = (left + right) / 2; if (A[mid] == target) return true; else if (target < A[mid]) right = mid - 1; else left = mid + 1; } return false; } };
“Here
is the code that used binary search. The matrix can be viewed as a one-dimensional sorted array. The value of element i in this array in the matrix is matrix[i/cols][i%cols]“
public class Solution { public boolean searchMatrix(int[][] matrix, int target) { // Start typing your Java solution below // DO NOT write main() function int rows = matrix.length; int cols = matrix[0].length; int s = 0, e = rows* cols - 1; while(s<=e){ int m = s+(e-s)/2; if(matrix[m/cols][m%cols]==target) return true; else if(matrix[m/cols][m%cols]>target){ e = m -1; }else{ s = m + 1; } } return false; } }
LeetCode之Search a 2D Matrix,布布扣,bubuko.com
原文:http://blog.csdn.net/smileteo/article/details/22199087