您的位置:首页 > 其它

[LeetCode]74.Search a 2D Matrix

2015-02-04 14:54 351 查看

【题目】

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
.

【思路一】

杨氏矩阵解法:

(1)如果数组中选取的数字刚好和查找的数字相等,查找结束,返回true

(2)如果数组中选取的数字小于查找的数字,根据排序规则,要查找的数字只能在当前选取的数字的右边。列数减一。

(3)如果数组中选取的数字大于查找的数字,根据排序规则,要查找的数字只能在当前选取的数字的下边。行数加一。

时间复杂度:O(m+n)

【代码】

/*------------------------------------
    *   日期:2015-02-04
    *   作者:SJF0115
    *   题目: 74.Search a 2D Matrix
    *   网址:https://oj.leetcode.com/problems/search-a-2d-matrix/
    *   结果:AC
    *   来源:LeetCode
    *   博客:
    ---------------------------------------*/
    #include <iostream>
    #include <vector>
    #include <cstring>
    #include <algorithm>
    using namespace std;

    class Solution {
    public:
        bool searchMatrix(vector<vector<int> > &matrix, int target) {
            if(matrix.empty()){
                return false;
            }//if
            int row = matrix.size();
            int col = matrix[0].size();
            int x = 0,y = col - 1;
            // 杨氏矩阵解法从右上角元素开始
            while(x < row && y >= 0){
                if(matrix[x][y] == target){
                    return true;
                }//if
                else if(matrix[x][y] < target){
                    ++x;
                }//else
                else{
                    --y;
                }
            }//while
            return false;
        }
    };

    int main(){
        Solution s;
        int target = 3;
        vector<vector<int> > matrix = {{1,3,5,7},{10,11,16,20},{23,30,34,50}};
        bool result = s.searchMatrix(matrix,target);
        // 输出
        cout<<result<<endl;
        return 0;
    }




【思路二】

根据排序规则,我们可以把矩阵看成一个串联起来的一维数组。正好可以利用二分查找。

n*m矩阵转换为一维数组:matrix[x][y] -> a[x*m + y]
一维数组转换为矩阵:a[x] -> matrix[x / m][ x % m]

时间复杂度:O(nmlognm)

【代码二】

/*------------------------------------
    *   日期:2015-02-04
    *   作者:SJF0115
    *   题目: 74.Search a 2D Matrix
    *   网址:https://oj.leetcode.com/problems/search-a-2d-matrix/
    *   结果:AC
    *   来源:LeetCode
    *   博客:
    ---------------------------------------*/
    class Solution {
    public:
        bool searchMatrix(vector<vector<int> > &matrix, int target) {
            if(matrix.empty()){
                return false;
            }//if
            int row = matrix.size();
            int col = matrix[0].size();
            int start = 0,end = row * col - 1;
            // 二分查找解法
            int mid,x,y;
            while(start <= end){
                mid = start + (end - start) / 2;
                x = mid / col;
                y = mid % col;
                if(matrix[x][y] == target){
                    return true;
                }//if
                else if(target > matrix[x][y]){
                    start = mid + 1;
                }//else
                else{
                    end = mid - 1;
                }//else
            }//while
            return false;
        }
    };


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: