LeetCode题解:Search a 2D Matrix

题目链接:

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:
1.Integers in each row are sorted from left to right.
2.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]
]

题目要求实现一个很有效率的方法,在一个m*n的矩阵中查找一个数值,当然这个矩阵是有一些特殊属性的:

  1. 矩阵的每一行都是有序的非递减的。
  2. 当前行的行首元素都要比前一行的行尾元素大。

如果查找到目标元素就返回TRUE,
否则就返回FALSE.


题目解释:

这道题是考察二分查找的题目,当我们看到效率的查找二字的时候我们可以有意识的考虑二分查找
根据矩阵的特性,其实我们可以发现,如果我们把矩阵按行序展开,变成一个一维的数组的话,这个数组是有序的(sorted)。对于有序数组的茶早,比较有效率当然是二分查找。


解题方案:

将二维的矩阵转换为一维矩阵,然后使用二分查找算法即可,那么如何将二位矩阵转换为一维呢?
一维矩阵的下表除二维矩阵的列数,可以得到二维矩阵的行数坐标,模二维矩阵的列数,可以得到二位矩阵的列数坐标

int x = pos / matrixColSize;
int y = pos % matrixColSize;

通过这样一个转换,我们就实现了。

那么二分查找的实现就是,设定一个left值和right值每次选取中点,判断中点是否是目标值,是的话直接返回true,否则如果当前中点值大于目标值就是左侧数组中查找,如果小于中点值就在数组右边中,然后重复此过程。算法时间的复杂度为O(log(n))


AC源码:

bool searchMatrix(int** matrix, int matrixRowSize, int matrixColSize, int target)
{
  //处理边界情况
  if(matrixColSize < 0 || matrixRowSize < 0) return false;

  int left = 0;
  int right = matrixRowSize * matrixColSize - 1;

  while(left <= right)
  {
    int mid = (left + right) / 2;

    int x = mid / matrixColSize;
    int y = mid % matrixColSize;

    if(matrix[x][y] == target) return true;
    else if(matrix[x][y] < target)
    {
      left = mid + 1;
    }
    else right = mid - 1;
  }
  return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值