新手算法学习之路----二分法Search-A-2D-Matrix
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了新手算法学习之路----二分法Search-A-2D-Matrix相关的知识,希望对你有一定的参考价值。
题目: 写出一个高效的算法来搜索 m × n矩阵中的值。
这个矩阵具有以下特性:
1 每行中的整数从左到右是排序的。
2 每行的第一个数大于上一行的最后一个整数。
考虑下列矩阵:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
给出 target = 3
,返回 true
解题思路: 首先在第一列上面找到target值所在的行号,可以先找到第一个大于target的行号,那么target值肯定在上一行(如果含有多行);然后,根据查找到的行号,在这一行上面通过二分法找到target值。
所遇问题:1,当执行到某一条语句的时候如果有return,那么return后面的语句就不执行了。
2,matrix == null语法正确,matrix ==NULL错误;
3,我绕了很大的弯路,我讨论了当只有一行和多行的情况下,执行二分法查找,这导致了代码冗长,最后虽然通过了但是太长导致连我自己都不想看了,更不用说考官了。然后自己有拿别人的和自己 对比进行了精简。其中代码中红色部分就是用来判断只有一行且里面没有target值,体现了我考虑事情不周全。
4,还有最后的row_num = end 见注释部分。
public boolean searchMatrix(int[][] matrix, int target) { //思想:先在第一列里面找target值如果知道就返回true,如果没找到就区间target值所在的区间 //然后继续二分法在确定这一行面找target值 int start = 0, end = matrix.length-1; int mid,row_num; boolean found = false; if(matrix == null||matrix.length== 0) return false; while (start<=end){ mid = start +(end-start)/2; if(matrix[mid][0]==target) { return true; }else if(matrix[mid][0]>target){ end = mid-1; }else start = mid+1; } row_num = end; //如果使用end的话,end在行20就已经减一了,就是target值所在行 if(row_num <0) return false; // 当只有一行的时候,start=end=matrix.length-1 =0 , // mid =0如果唯一的一行的第一个元素大于target的时候 end = mid -1, end <0就说明数组没有含有target值 start = 0; end = matrix[row_num].length-1; while(start<=end){ mid = start +(end-start)/2; if(matrix[row_num][mid]==target){ return true; }else if(matrix[row_num][mid]>target) { end = mid -1; } else start = mid+1; } return false; }
以上是关于新手算法学习之路----二分法Search-A-2D-Matrix的主要内容,如果未能解决你的问题,请参考以下文章
新手算法学习之路----二分法Maximum-in-Mountain-Sequence
新手算法学习之路----二分法Search-for-a-Range