# 240. Search a 2D Matrix II
題目:<https://leetcode.com/problems/search-a-2d-matrix-ii/>
解法:先取其中一行,進行 binary search,如果沒找到再依據最接近的位置,可以排除左上部分較小的值跟右下部分較大的值,再分別搜尋左下部分跟右上部分。
Python3:
``` python 3
class Solution:
def searchMatrix(self, matrix: list[list[int]], target: int) -> bool:
def search2D(rowStart, rowEnd, colStart, colEnd):
if rowStart >= rowEnd or colStart >= colEnd:
return False
midRow = (rowStart + rowEnd) // 2
left = colStart
right = colEnd
while left < right:
mid = (left + right) // 2
if matrix[midRow][mid] > target:
right = mid
elif matrix[midRow][mid] < target:
left = mid + 1
else:
return True
return search2D(midRow+1, rowEnd, colStart, left) \
or search2D(rowStart, midRow, left, colEnd)
return search2D(0, len(matrix), 0, len(matrix[0]))
if __name__ == '__main__':
matrix = [[1,4,7,11,15],
[2,5,8,12,19],
[3,6,9,16,22],
[10,13,14,17,24],
[18,21,23,26,30]]
target = 31
ans = Solution().searchMatrix(matrix, target)
print(ans)
```
C:
``` c
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {
bool search2D(int rowStart, int rowEnd, int colStart, int colEnd) {
if (rowStart >= rowEnd || colStart >= colEnd)
return false;
int midRow = (rowStart + rowEnd) / 2, left = colStart, right = colEnd;
while (left < right) {
int mid = (left + right) / 2;
if (matrix[midRow][mid] > target)
right = mid;
else if (matrix[midRow][mid] < target)
left = mid + 1;
else
return true;
}
return search2D(midRow+1, rowEnd, colStart, left)
|| search2D(rowStart, midRow, left, colEnd);
}
return search2D(0, matrixSize, 0, matrixColSize[0]);
}
int main()
{
int data[5][5] = {{1,4,7,11,15},
{2,5,8,12,19},
{3,6,9,16,22},
{10,13,14,17,24},
{18,21,23,26,30}};
int matrixSize = 5;
int * matrixColSize = (int*)malloc(sizeof(int) * matrixSize);
int ** matrix = (int**)malloc(sizeof(int*) * matrixSize);
for (int i = 0; i < matrixSize; i++) {
matrixColSize[i] = 5;
matrix[i] = (int*)malloc(sizeof(int) * 5);
for (int j = 0; j < matrixColSize[i]; j++)
matrix[i][j] = data[i][j];
}
int target = 19;
bool ans = searchMatrix(matrix, matrixSize, matrixColSize, target);
printf("%s\n", ans ? "True" : "False");
return 0;
}
```
###### tags: `leetcode` `array` `matrix` `divide and conquer` `binary search`