LeetCode-74.搜索二维矩阵

349 阅读1分钟

题目描述

编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:

每行中的整数从左到右按升序排列。

每行的第一个整数大于前一行的最后一个整数。

1.png

2.png

题目解析

思路:可以将二维矩阵想象成一维的,一个升序的一维数组;

3.png

4.png 方法一:最暴力的方法就是直接从第一位数遍历,遍历是否有一个数和target相等。

方法二:可以使用二分查找的思想来解决,从nLeft=0到nRight=mn-1进行搜索,计算的中间位置nMid,因为是二维的数组需要将nMid转换成行Y和列X,nMix/n(n是矩阵的列数)可以等到行Y,然后nMix-nY可以得到列X。

5.png

代码实现

方案一实现代码:

class Solution {
public:
    bool searchMatrix(vector< vector<int> >& matrix, int target) {
        for(int i=0; i<matrix.size(); i++) {
            for(int j=0; j<matrix[i].size(); j++) {
                if(matrix[i][j] == target) {
                    return true;
                }
            }
        }
        return false;
    }
};

方案二实现代码:

class Solution {
public:
    bool searchMatrix(vector< vector<int> >& matrix, int target) {
        int nRight = matrix.size() * matrix[0].size() - 1;
        int nLetf = 0;
        int nWidth = matrix[0].size();
        int nHeight = matrix.size();
        while(nLetf <= nRight) {
            int nMid = (nLetf + nRight) / 2;
            int y = nMid / nWidth;
            int x = nMid - y * nWidth;
            if(matrix[y][x] == target) {
                return true;
            }
            else if(matrix[y][x] < target) {
                nLetf = nMid + 1;
            } 
            else {
                nRight = nMid - 1;
            }
        }
        return false;
    }
};