You are given an m x n
integer matrix matrix with the following two properties:
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.
matrix
(matrix
를 위에서 부터 가로로 이어 붙였을 때 정렬되어 있음)target
target
이 matrix
에 있는지 없는지를 반환해당 문제가 Binary Search가 어울리는 이유
matrix
가 2차원 배열이지만, 사실 가로로 이어붙이면 사싱 정렬되어 있는 1차원 배열로 간주하고 볼 수 있다. 기본 전략
matrix
를 1차원 배열로 간주하기0
부터 원소의 개수 - 1
로 생각하며 matrix의 i
번째 원소를 찾는 방법을 고안 (matrix[index / rowSize][index % rowSize]
를 이용)class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
int front = 0;
int behind = matrix.length * matrix[0].length - 1;
while (front <= behind) {
int middle = (front + behind) / 2;
int middleValue = getElement(matrix, middle);
if (target < middleValue) {
behind = middle - 1;
} else if (target > middleValue) {
front = middle + 1;
} else {
return true;
}
}
return false;
}
private int getElement(int[][] matrix, int index) {
int rowSize = matrix[0].length;
return matrix[index / rowSize][index % rowSize];
}
}