240. 搜索二维矩阵 II
给定M×N矩阵,每一行、每一列都按升序排列,请编写代码找出某元素。
看到这题,最简单的就是直接一次遍历所有元素,时间复杂度是O(m*n)。
当然,看到升序,也比较容易想到二分查找,可以按行遍历m次,每次使用二分查找。
但是,还有没有其他更好的办法呢?
倒三角线遍历
观察发现,如果从右上角开始遍历,直到左下角结束,假设当前元素为cur,可以发现:
- 如果cur<target, 由于cur是这一行中最大的数,则可以舍弃这一行,cur下移
- 如果cur>target, 由于cur是这一列中最小的数,则可以舍弃这一列,cur左移
1 | class Solution: |
C++版本
1 | class Solution { |
当然, 从左下角走到右上角也是OK的, 代码如下:
1 | class Solution: |
正三角遍历
将矩阵划分为四块:左上、右上、左下、右下,每次可以排除其中一块
1 | class Solution: |
74. 搜索二维矩阵
编写一个高效的算法来判断m x n矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
两次二分查找
可以先按第一列二分查找确定所在的行,然后再对行做一次二分
一次二分
将整个矩形视作一个一维数组,直接一次二分完成
1 | class Solution: |
C++版本
1 | class Solution { |