• [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
  • 相关阅读:
    JavaScript中双叹号“!!”作用
    JavaScript两个变量的值交换的多种方式
    自定义npm包——typeScript版本
    自定义npm包的创建、发布、更新和撤销
    vuex概念总结及简单使用实例
    详解javascript: void(0);
    面向对象的CSS
    vue指令概览
    实现水平居中的办法
    C#分块下载文件
  • 原文地址:https://www.cnblogs.com/freeneng/p/3099956.html
Copyright © 2020-2023  润新知