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
.
Have you met this question in a real interview?
Analysis:
This is a double binary search problem. First, we use binary search to determine the row in which the target is; Second, we use binary search to search the determined row.
Solution:
1 public class Solution { 2 public boolean searchMatrix(int[][] matrix, int target) { 3 int xLen = matrix.length; 4 if (xLen==0) return false; 5 int yLen = matrix[0].length; 6 if (yLen==0) return false; 7 8 //Determine row. 9 int x = 0; 10 int y = xLen-1; 11 int k = -1; 12 int targetRow = -1; 13 while (targetRow==-1){ 14 if (y<x) return false; 15 16 k = x + (y-x)/2; 17 if (target<matrix[k][0]){ 18 y = k-1; 19 continue; 20 } else if (target>matrix[k][yLen-1]){ 21 x = k+1; 22 continue; 23 } else { 24 targetRow = k; 25 continue; 26 } 27 } 28 29 //Search the target element in the targetRow 30 x = 0; 31 y = yLen-1; 32 k = -1; 33 boolean findTarget = false; 34 while (!findTarget){ 35 if (y<x) { 36 findTarget = false; 37 break; 38 } 39 40 k=x+(y-x)/2; 41 if (target==matrix[targetRow][k]){ 42 findTarget = true; 43 break; 44 } else if (target<matrix[targetRow][k]){ 45 y = k-1; 46 continue; 47 } else { 48 x = k+1; 49 continue; 50 } 51 } 52 return findTarget; 53 } 54 }