zoukankan      html  css  js  c++  java
  • 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是否存在。这个的算法时间复杂度是O(log(rows)+log(columns))。 

    代码

     1 /**
     2  * 本代码由九章算法编辑提供。没有版权欢迎转发。
     3  * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
     4  * - 现有的面试培训课程包括:九章算法班,系统设计班,BAT国内班
     5  * - 更多详情请见官方网站:http://www.jiuzhang.com/
     6  */
     7 
     8 // Binary Search Twice
     9 public class Solution {
    10     public boolean searchMatrix(int[][] matrix, int target) {
    11         if (matrix == null || matrix.length == 0) {
    12             return false;
    13         }
    14         if (matrix[0] == null || matrix[0].length == 0) {
    15             return false;
    16         }
    17         
    18         int row = matrix.length;
    19         int column = matrix[0].length;
    20         
    21         // find the row index, the last number <= target 
    22         int start = 0, end = row - 1;
    23         while (start + 1 < end) {
    24             int mid = start + (end - start) / 2;
    25             if (matrix[mid][0] == target) {
    26                 return true;
    27             } else if (matrix[mid][0] < target) {
    28                 start = mid;
    29             } else {
    30                 end = mid;
    31             }
    32         }
    33         if (matrix[end][0] <= target) {
    34             row = end;
    35         } else if (matrix[start][0] <= target) {
    36             row = start;
    37         } else {
    38             return false;
    39         }
    40         
    41         // find the column index, the number equal to target
    42         start = 0;
    43         end = column - 1;
    44         while (start + 1 < end) {
    45             int mid = start + (end - start) / 2;
    46             if (matrix[row][mid] == target) {
    47                 return true;
    48             } else if (matrix[row][mid] < target) {
    49                 start = mid;
    50             } else {
    51                 end = mid;
    52             }
    53         }
    54         if (matrix[row][start] == target) {
    55             return true;
    56         } else if (matrix[row][end] == target) {
    57             return true;
    58         }
    59         return false;
    60     }
    61 }
    62 
    63 // Binary Search Once
    64 public class Solution {
    65     public boolean searchMatrix(int[][] matrix, int target) {
    66         if (matrix == null || matrix.length == 0) {
    67             return false;
    68         }
    69         if (matrix[0] == null || matrix[0].length == 0) {
    70             return false;
    71         }
    72         
    73         int row = matrix.length, column = matrix[0].length;
    74         int start = 0, end = row * column - 1;
    75         
    76         while (start + 1 < end) {
    77             int mid = start + (end - start) / 2;
    78             int number = matrix[mid / column][mid % column];
    79             if (number == target) {
    80                 return true;
    81             } else if (number < target) {
    82                 start = mid;
    83             } else {
    84                 end = mid;
    85             }
    86         }
    87         
    88         if (matrix[start / column][start % column] == target) {
    89             return true;
    90         } else if (matrix[end / column][end % column] == target) {
    91             return true;
    92         }
    93         
    94         return false;
    95     }
    96 }
     

     

  • 相关阅读:
    实验5 Spark SQL 编程初级实践
    豆瓣基础架构
    淘宝数据魔方技术架构解析
    质量属性的六个常见属性场景--淘宝网
    Win10家庭版WindowsUpdate属性为灰色
    豆瓣的基础架构
    京东618实践:一元抢宝系统的数据库架构优化
    FunData — 电竞大数据系统架构演进
    Ubuntu14.0使用gparted调整分区大小
    二阶段开发冲刺一
  • 原文地址:https://www.cnblogs.com/hygeia/p/4651751.html
Copyright © 2011-2022 走看看