每天一道LeetCode-----在有序的二维数组中查找某个元素

来源:互联网 发布:大学生逃课数据 编辑:程序博客网 时间:2024/05/19 12:29

原题链接Search a 2D Matrix

这里写图片描述

判断一个二维数组中是否存在某个值

该数组满足

  • 每一行元素按从左到右递增顺序排列
  • 当前行的第一个元素大于上一行的最后一个元素

假设二维数组的维度是m × n

考虑二维数组中第0行最后一列的元素matrix[i][j],即i = 0, j = n - 1

如果matrix[i][j] == target,那么直接返回就可以。

现在考虑不相等的情况,根据数组的排列情况可知

由matrix[i][j]的位置可知,在第i行,没有比matrix[i][j]大的值;在第j列,没有比matrix[i][j]小的值,即

matrix[i][j - 1] < matrix[i][j]并且matrix[i + 1][j] > matrix[i][j]

也就是说第一个比matrix[i][j]大的元素是matrix[i + 1][j],而第一个比matrix[i][j]小的元素是matrix[i][j - 1]

假设matrix[i][j] > target,那么应该找第一个比matrix[i][j]大的元素,所以跳到下一行寻找,即另i = i + 1。一旦另i = i + 1,就好比承认从第i行的第j列,第i行的第j-1列,…,第i行的第0列元素都比target小,那么就没必要在第i行上浪费时间,直接跳到下一行,把[i + 1, j]看做是二维数组第0行最后一列的位置。也就是说,现在二维数组的维度是(m - i - 1) × n,第0行最后一列的元素是matrix[i + 1][j]

假设matrix[i][j] < target,那么应该找第一个比matrix[i][j]小的元素,由上面的结论可知在j-1列,所以另j = j - 1。一旦另j = j - 1,就好比承认第i行的第j列,第i+1行的第j列,…,第m行的第j列元素都比target大,那么就可以把第j列抛弃掉,把[i, j - 1]看做是二维数组第0行最后一列的位置。也就是说,现在二维数组的维度是m × j,第0行最后一列的元素是matrix[i][j - 1]

这样,以新的起始点开始执行查找操作,程序唯一需要做的事情就是判断matrix[i][j]和target的大小,matrix[i][j]大,则j = j - 1;matrix[i][j]小,则i = i + 1

代码如下

class Solution {public:    bool searchMatrix(vector<vector<int>>& matrix, int target) {        if(matrix.empty() || matrix[0].empty())            return false;        int m = matrix.size();        int n = matrix[0].size();        int i = 0, j = n - 1;        while(i < m && j >= 0)        {            if(matrix[i][j] == target)                return true;            /* 向左移动 */            else if(matrix[i][j] > target)                --j;            /* 向下移动 */            else                ++i;        }        return false;    }};

原题链接Search a 2D Matrix II

这里写图片描述

二维数组中元素的排列规则为

  • 每一行的元素从左到右按递增顺序排列
  • 每一列的元素从上到下按递增顺序排列

解决方法和上面一模一样

代码如下

class Solution {public:    bool searchMatrix(vector<vector<int>>& matrix, int target) {        if(matrix.empty() || matrix[0].empty())        return false;        int m = matrix.size();        int n = matrix[0].size();        int i = 0, j = n - 1;        while(i < m && j >= 0)        {            if(matrix[i][j] == target)                return true;            /* 向左移动 */            else if(matrix[i][j] > target)                --j;            /* 向下移动 */            else                ++i;        }        return false;    }};