zoukankan      html  css  js  c++  java
  • Leetcode 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.

    方法一,先纵向查找,再横向查找,时间复杂度为O(logm)+O(logn)

    class Solution {
    public:
        bool searchMatrix(vector<vector<int> > &matrix, int target) {
            int n = matrix.size(), m = matrix[0].size();
            if(target < matrix[0][0] || target >matrix[n-1][m-1]) return false;
            int left = 0 , right = n-1, targetRow = 0;
            //纵向二分查找
            while(left <= right){
                int mid = (left+right)>>1;
                if(matrix[mid][0] > target ) right = mid-1;
                else if(matrix[mid][0] < target) left = mid+1;
                else break;
            }
            if(left>right) targetRow =right;
            else return true;
            //横向二分查找
            left = 0;right = m-1;
            while(left <= right){
                int mid = (left+right)>>1;
                if(matrix[targetRow][mid] > target) right = mid-1;
                else if(matrix[targetRow][mid] < target) left = mid+1;
                else break;
            }
            if(left <=right ) return true;
            else return false;
        }
    };
    先纵向后横向查找

    方法二,直接二分查找

    class Solution {
    public:
        bool searchMatrix(vector<vector<int> > &matrix, int target) {
            int n = matrix.size(), m = matrix[0].size();
            if(target < matrix[0][0] || target >matrix[n-1][m-1]) return false;
            int left = 0 , right = n*m-1;
            while(left<=right){
                int mid = (left+right)>>1;
                if(matrix[mid/m][mid%m] > target) right = mid-1;
                else if(matrix[mid/m][mid%m] <  target) left = mid+1;
                else return true;
            }
            return false;
        }
    };
    整体查找
  • 相关阅读:
    web服务器有哪些_nodejs的工作原理是什么
    WebRTC的运行流程和运行机制到底是怎么进行的
    认识WebRTC的整体架构以及它重要的目录结构是什么
    api接口风格restful风格的十大规范
    Mysql中高级操作中的视图_事务_索引_账户权限管理
    C#常见几种集合比较
    堆(Heap)和栈(Stack)
    线程同步的几种方式
    使用临时表大批量插入数据
    select出来的表增加递增列
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3809190.html
Copyright © 2011-2022 走看看