Lintcode_28 Search a 2D Matrix

来源:互联网 发布:java 退出程序 编辑:程序博客网 时间:2024/06/10 16:02

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.
Example

Consider the following matrix:

[    [1, 3, 5, 7],    [10, 11, 16, 20],    [23, 30, 34, 50]]

Given target = 3, return true.

Challenge 

O(log(n) + log(m)) time

思路是做个函数的映射,用二分法解决:

class Solution {public:    /**     * @param matrix, a list of lists of integers     * @param target, an integer     * @return a boolean, indicate whether matrix contains target     */    bool searchMatrix(vector<vector<int> > &matrix, int target) {        // write your code here        if (matrix.size() == 0)           return false;        int head=0;        int tail=matrix.size()*matrix[0].size()-1;        while (tail - head > 1) {            int mid = (tail + head)/2;            // cout<<mid<<" "<<reflect(mid,matrix)<<endl;            if (reflect(mid,matrix) > target) {                tail = mid;                continue;            }            if (reflect(mid,matrix) < target) {               head = mid;               continue;            }            if (reflect(mid,matrix) == target) {               return true;            }        }        if (reflect(head,matrix) == target || reflect(tail,matrix)==target  || reflect((head+tail)/2,matrix)==target)            return true;        else            return false;    }        int reflect(int ind, vector<vector<int> > &matrix) {        int i=ind/matrix[0].size();        int j=ind%matrix[0].size();        return matrix[i][j];    }};




0 0