小菜鸟的博客

慢慢积累吧女汉子

Search a 2D Matrix(medium)

题目

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.


题意

       在一个二维矩阵中找到给定的值。矩阵从上到下从左到右有序

分析

    与剑指offer里面的一个题类似,思路是从右上角元素开始遍历,每次遍历中若与target相等则返回true;若小于则行向下移动;若大于则列向左移动。时间复杂度m+n

实现

class Solution {
public:
    bool searchMatrix(vector<vector<int> > &matrix, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function
        int i = 0, j = matrix[0].size() - 1;
        
        while (i < matrix.size() && j >= 0)
        {
            if (target == matrix[i][j])
                return true;
            else if (target < matrix[i][j])
                j--;
            else
                i++;
        }
        
        return false;
    }
};

参考别人:

     第二种方法:二分法确定target可能在第几行出现。再用二分法在该行确定target可能出现的位置。时间复杂度O(logn+logm)


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 middle = left + (right-left)/2;
                if(matrix[middle][0] < target)
                {
                    left = middle+1;
                }
                else if(matrix[middle][0] > target)
                {
                    right = middle-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 middle = left + (right-left)/2;
                if(matrix[row][middle] < target)
                {
                    left = middle+1;
                }
                else if(matrix[row][middle] > target)
                {
                    right = middle-1;
                }
                else
                {
                    return true;
                }
            }
            return false;
        }
        
    }
};


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/haihaa/article/details/51563991
文章标签: Search a 2D Matrixme
个人分类: leetcode
上一篇Remove Nth Node From End of List(easy)
下一篇Search for a Range(medium)
博主设置当前文章不允许评论。

A matrix handbook for statisticians

2013年10月03日 5.99MB 下载

turtle作图作品

2018年06月25日 7.57MB 下载

leetcode C语言全解

2018年04月19日 1.06MB 下载

Unity 2D A星尋路算法實現(2D與2.5D)

2016年09月20日 5.6MB 下载

Graphics Math Library

2010年02月22日 23KB 下载

MATLAB矩阵计算工具箱

2014年11月07日 546KB 下载

没有更多推荐了,返回首页

关闭
关闭