【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比较,有三种情况:

  1. 相等,说明找到了target;
  2. 右上角元素比target元素大,那么说明target在第一行,递归的搜索第一行。
  3. 右上角元素比target元素小,那么说明target在第二行及以后,递归的搜索如下图所示区域:

【leetcode刷题笔记】Search a 2D Matrix

代码如下:

 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 }

你可能感兴趣的:(LeetCode)