Search a 2D Matrix
LeetCode 74. Search a 2D Matrix
원문
You are given an m x n
integer matrix matrix
with the following two properties:
- Each row is sorted in non-decreasing order.
- The first integer of each row is greater than the last integer of the previous row.
Given an integer target
, return true
if target
is in matrix
or false
otherwise.
You must write a solution in O(log(m * n))
time complexity.
풀이
이분 탐색을 이용해 어느 행에 원소가 있는지 찾는다. 그 다음 다시 이분 탐색으로 해당 행의 어느 열에 원소가 있는지 찾는다.
두 번째 이분 탐색에서 원소를 찾지 못하면 false
, 찾으면 true
를 반환한다.
이분 탐색을 두 번 하기 때문에 시간 복잡도가 O(log(m) + log(n)) = O(log(m * n))
이다.
코드
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
r1, r2 = 0, len(matrix) - 1
c1, c2 = 0, len(matrix[0]) - 1
while r1 < r2:
mid_r = (r1 + r2) // 2
if matrix[mid_r][0] < target:
if matrix[mid_r][-1] >= target:
r2 = mid_r
break
r1 = mid_r + 1
else: r2 = mid_r
while c1 < c2:
mid_c = (c1 + c2) // 2
if matrix[r2][mid_c] < target:
c1 = mid_c + 1
else: c2 = mid_c
return True if matrix[r2][c2] == target else False
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int r1 = 0, r2 = matrix.length - 1;
int c1 = 0, c2 = matrix[0].length - 1;
while (r1 < r2) {
int mid_r = (r1 + r2) / 2;
if (matrix[mid_r][0] < target) {
if (matrix[mid_r][matrix[mid_r].length - 1] >= target) {
r2 = mid_r;
break;
}
r1 = mid_r + 1;
} else {
r2 = mid_r;
}
}
while (c1 < c2) {
int mid_c = (c1 + c2) / 2;
if (matrix[r2][mid_c] < target) {
c1 = mid_c + 1;
} else {
c2 = mid_c;
}
}
if (matrix[r2][c2] == target) {
return true;
}
return false;
}
}
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.