原題鏈接:
https://leetcode.cn/problems/search-a-2d-matrix-ii/
解題思路:
- 每一行都是遞增的,那就意味著可以對(duì)每一行做二分查找
- 如果找到了
target就返回true,如果查找完所有行都沒有找到target,返回false - 如何二分查找:
- 首先聲明左邊界
let left = 1,右邊界let right = 1000 - 計(jì)算它們的中間值,
const middle = (left + right) >> 1,或者可以用const middle = Math.floor((left + right) / 2) - 如果中間值等于
target,說(shuō)明找到了target - 如果中間值大于
target,說(shuō)明target的值在left和middle之間,因此可以讓right = middle - 1,繼續(xù)在left和middle - 1之間查找target - 如果中間值小于
target,說(shuō)明target的值在middle和right之間,因此可以讓left = middle + 1,繼續(xù)在right和middle + 1之間查找target
- 首先聲明左邊界
/**
* @param {number[][]} matrix
* @param {number} target
* @return {boolean}
*/
var searchMatrix = function (matrix, target) {
// 枚舉每一行
for (const row of matrix) {
// 在每一行中,使用二分查找搜索是否有數(shù)字等于target
if (binarySearch(row, target)) {
return true
}
}
return false
}
// 二分查找
const binarySearch = (row, target) => {
let left = 0 // 左邊界
let right = row.length - 1 // 右邊界
// 不斷搜索直到兩個(gè)指針相遇
while (left <= right) {
// 每次取中間索引
const middle = (left + right) >> 1
// 查找到中間位置的值
const middleItem = row[middle]
// 如果查找到target,返回true
if (middleItem === target) {
return true
}
// 如果中間值大于target,說(shuō)明target在左半邊
// 將右邊界移動(dòng)到middle - 1
else if (middleItem > target) {
right = middle - 1
}
// 如果中間值小于target,說(shuō)明target在右半邊
// 將左邊界移動(dòng)到middle + 1
else {
left = middle + 1
}
}
return false
}
復(fù)雜度分析
- 時(shí)間復(fù)雜度:
O(mlog?n)(m為行數(shù),n為列數(shù))。對(duì)一行使用二分查找的時(shí)間復(fù)雜度為O(log?n),最多需要進(jìn)行m次二分查找。 - 空間復(fù)雜度:
O(1)。