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;
- 右上角元素比target元素大,那么说明target在第一行,递归的搜索第一行。
- 右上角元素比target元素小,那么说明target在第二行及以后,递归的搜索如下图所示区域:
代码如下:
1 public class Solution { 2 private boolean IfFind = false; 3 private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){ 4 if(m_start > m_end || n_start > n_end) 5 return; 6 7 if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length) 8 return; 9 10 if(matrix[m_start][n_end] == target){ 11 IfFind = true; 12 return; 13 } 14 if(matrix[m_start][n_end] > target) 15 RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1); 16 else { 17 RightCornerRecur(matrix, target, m_start+1,m_end, n_start, n_end); 18 } 19 20 } 21 public boolean searchMatrix(int[][] matrix, int target) { 22 RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1); 23 return IfFind; 24 } 25 }
右上角可以用来比较剪掉一些元素,左下角同样可以,下面的代码中加上了左下角元素与target元素的比较,最终的运行时间是384ms,而上述只考虑右上角的运行时间是472ms。
1 public class Solution { 2 private boolean IfFind = false; 3 private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){ 4 5 if(m_start > m_end || n_start > n_end) 6 return; 7 8 if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length) 9 return; 10 11 12 if(matrix[m_start][n_end] == target){ 13 IfFind = true; 14 return; 15 } 16 17 if(matrix[m_start][n_end] > target) 18 RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1); 19 20 else { 21 if(matrix[m_end][0] == target){ 22 IfFind = true; 23 return; 24 } 25 if(matrix[m_end][0] < target) 26 RightCornerRecur(matrix, target, m_end, m_end, n_start+1, n_end); 27 else 28 RightCornerRecur(matrix, target, m_start+1,m_end-1, n_start, n_end); 29 } 30 31 } 32 public boolean searchMatrix(int[][] matrix, int target) { 33 RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1); 34 return IfFind; 35 } 36 }