首页 > 代码库 > 【leetcode刷题笔记】Search a 2D Matrix
【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比较,有三种情况:
- 相等,说明找到了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 else28 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。