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.

    分析:题意为在一个mxn矩阵中查找目标值。可以先通过二分法确定目标值target可能出现的行,然后再用一次二分法确定目标值target在行中的可能位置。

     时间复杂度为O(logn+logm)

    code如下:

    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            int left=0;
            int right=matrix.size()-1;
            if(left != right){
                while(left <= right){
                    int mid=left + (right-left)/2;
                    if(matrix[mid][0]<target){
                        left=mid+1;
                    }
                    else if(matrix[mid][0]>target){
                        right=mid-1;
                    }
                    else {
                        return true;
                    }
                }
            }
            if(right==-1){
                return false;
            }
            else{
                int row=right;
                int left=0;
                int right=matrix[row].size()-1;
                while(left<=right){
                    int mid=left + (right-left)/2;
                    if(matrix[row][mid]<target){
                        left=mid+1;
                    }
                    else if(matrix[row][mid]>target){
                        right=mid-1;
                    }
                    else {
                        return true;
                    }
                }
                return false;
            }
        }
    };
    

    其他思路:

    从左下角元素开始遍历,每次遍历中若与目标值target相等则返回true;若小于则列向右移动;若大于则行向下移动。时间复杂度O(logn+logm)
    code如下:
    class Solution {
    public:
        bool searchMatrix(vector<vector<int>>& matrix, int target) {
            int i=matrix.size()-1;
            int j=0;
            int m=matrix.size();
            int n=matrix[0].size();
            while(i>=0 && j<n){
                if(matrix[i][j] > target){
                    i--;
                }
                else if(matrix[i][j] == target){
                    return true;
                }
                else{
                    j++;
                }
            }
            return false;
        }      
    };
    

      

      

  • 相关阅读:
    排列组合例题分析
    短信微服务+springboot+redis整合,动态获取短信验证码
    mac版idea 2018.3.5版 永久激活教程
    windows版idea 2018.3.5版 永久激活教程
    深入理解 Java 垃圾回收机制
    如何写代码 —— 编程内功心法
    并发与并行的区别
    Lua语法要点
    android 手机上运行图像算法
    OPENCL 错误码
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/4856287.html
Copyright © 2011-2022 走看看