Leetcode_search-a-2d-matrix

来源:互联网 发布:client mac addr 编辑:程序博客网 时间:2024/06/14 10:43

地址: http://oj.leetcode.com/problems/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.

思路:二维的二分查找。先确定在哪一行,再确定在哪一列。

剑指offer上有道题跟这个类似,但是条件没有这么强,是线性的减小搜索范围的。既然是有序的,我认为就应该二分查找。

这道题应该在一个安静的环境下耐心的写。写的时候环境不好,头都大了,写了好久。

参考代码:


class Solution {public:    bool searchMatrix(vector<vector<int> > &matrix, int target) {        if(matrix.empty())            return false;        int row = matrix.size(), col = matrix[0].size();        if(target < matrix[0][0] || target > matrix[row-1][col-1])            return false;        int i = 0, endi = row-1;        while(i<=endi)        {            if(target < matrix[(i+endi)/2][0])            {                endi = (i+endi)/2-1;            }            else if(target > matrix[(i+endi)/2][0])            {                if(target > matrix[(i+endi)/2][col-1])                    i=(i+endi)/2+1;                else if(target < matrix[(i+endi)/2][col-1])                {                    int j = 0, endj = col-1;                    while(j<=endj)                    {                        if(target < matrix[(i+endi)/2][(j+endj)/2])                        {                            endj = (j+endj)/2-1;                        }                        else if(target > matrix[(i+endi)/2][(j+endj)/2])                        {                            j = (j+endj)/2+1;                        }                        else                            return true;                    }                    return false;                }                else                    return true;            }            else                return true;        }        return false;    }};

//SECOND TRIAL
//剪枝再二分搜索
class Solution {public:    bool searchMatrix(vector<vector<int> > &matrix, int target) {        if(matrix.empty())            return false;        int row = matrix.size(), col = matrix[0].size();        int r = 0, c = col-1;        while(r < row && c>=0)        {            if(matrix[r][c] > target)            {                if(matrix[r][0]>target)                    return false;                else if(matrix[r][0]<target)                {                    int i = 1, j = c-1;                    while(i<=j)                    {                        int mid = (i+j)/2;                        if(matrix[r][mid]>target)                            j = mid-1;                        else if(matrix[r][mid]<target)                            i = mid+1;                        else                            return true;                    }                    return false;                }                else                    return true;            }            else if(matrix[r][c] < target)                ++r;            else                return true;        }        return false;    }};




//Thrid trial
//剪枝再线性搜索, 比上一个要差
class Solution {public:    bool searchMatrix(vector<vector<int> > &matrix, int target) {        if(matrix.empty())            return false;        int row = matrix.size(), col = matrix[0].size();        int r = 0, c = col-1;        while(r < row && c>=0)        {            if(matrix[r][c] > target)                --c;            else if(matrix[r][c] < target)                ++r;            else                return true;        }        return false;    }};


0 0