zoukankan      html  css  js  c++  java
  • [Leetcode 62] 74 Search a 2D Matrix

    Problem:

    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.

    Analysis:

    Since each row of the given matrix is sorted, we can use binary search to accelarate the search.

    To locate the which to use binary search, we need to find 2 rows that row1's first element is less than target and row2's first element is greater then target. Then apply binary search to row1.

    A problem here is the last row will never be searched, so we need to binary search it at last.

    Code:

     1 class Solution {
     2 public:
     3     bool searchMatrix(vector<vector<int> > &matrix, int target) {
     4         // Start typing your C/C++ solution below
     5         // DO NOT write int main() function
     6         if (matrix.size() == 0) {
     7           return false;  
     8         } else if (matrix.size() == 1) {
     9             return bs(matrix[0], target);
    10         } else {
    11             for (int i=1; i<matrix.size(); i++) {
    12                 if (matrix[i][0] == target || matrix[i-1][0] == target)
    13                     return true;
    14                 else if (matrix[i][0] > target && matrix[i-1][0] < target)
    15                     return bs(matrix[i-1], target);
    16             }
    17         
    18             return bs(matrix[matrix.size()-1], target);
    19         }
    20     }
    21     
    22     bool bs(vector<int> &array, int target) {
    23         int lo = 0, hi = array.size()-1;
    24         
    25         while (lo <= hi) {
    26             int mid = (lo+hi) / 2;
    27             
    28             if (array[mid] == target) {
    29                 return true;
    30             } else if (array[mid] > target) {
    31                 hi = mid - 1;
    32             } else {
    33                 lo = mid + 1;
    34             }
    35         }
    36         
    37         return false;
    38     }
    39 };
    View Code
  • 相关阅读:
    锁,你知多少呢?
    成长于我
    js write google广告
    项目三边六拍
    IT新人培养计划
    网站变灰色 代码
    职业人生
    ASP.NET 4 新特性之一二
    .net 例子
    A Better sp_who2 using DMVs (sp_who3)
  • 原文地址:https://www.cnblogs.com/freeneng/p/3099956.html
Copyright © 2011-2022 走看看