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;
        }      
    };
    

      

      

  • 相关阅读:
    CSS对 网页进行布局
    myeclipse配置tomcat服务器
    JDBC链接数据库
    java集合框架
    java日期操作
    二叉树的最近公共祖先
    二叉树的深度
    飞地的数量
    岛屿数量
    岛屿的最大面积
  • 原文地址:https://www.cnblogs.com/carsonzhu/p/4856287.html
Copyright © 2011-2022 走看看