新手算法学习之路----二分法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

新手算法学习之路----二分法Find Minimum in Rotated Sorted Array

新手算法学习之路----宽度优先算法

新手算法学习之路----二叉树(二叉树最大路径和)

新手算法学习之路----二叉树(二叉树的路径和)