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
.
题目标签:Array
题目给了我们一个有序的矩阵,让我们找target是否在矩阵中。首先我们分析,如果我们知道了target 在哪一行的话,直接用binary search 就可以了。所以第一步可以用binary search 来搜索第一列,确认target在哪一行。在用一次二分法对于那一行,找出target。
Java Solution:
Runtime beats 71.85%
完成日期:07/23/2017
关键词:Array
关键点:用二分法两次
1 public class Solution 2 { 3 public boolean searchMatrix(int[][] matrix, int target) 4 { 5 if(matrix.length == 0 || matrix[0].length == 0) 6 return false; 7 if(target < matrix[0][0] || target > matrix[matrix.length-1][matrix[0].length-1]) 8 return false; 9 // first determine which row the target is in10 int top = 0;11 int bottom = matrix.length-1;12 13 while(top <= bottom)14 {15 int mid = top + (bottom - top) / 2;16 17 if(matrix[mid][0] == target)18 return true;19 else if(matrix[mid][0] > target)20 bottom = mid - 1;21 else22 top = mid + 1;23 }24 25 int rowNum = bottom;26 27 // use binary search for this row28 int left = 0;29 int right = matrix[0].length-1;30 31 while(left <= right)32 {33 int mid = left + (right - left) / 2;34 35 if(matrix[rowNum][mid] == target)36 return true;37 else if(matrix[rowNum][mid] < target)38 left = mid + 1;39 else40 right = mid - 1;41 42 }43 44 return false;45 }46 }
参考资料:
http://www.cnblogs.com/grandyang/p/4323301.html
LeetCode 算法题目列表 -