240.搜索二维矩阵 II

题目描述

思路 and Swift 题解
这道题可以使用二分搜索来快速解决。
具体来说,首先比较数组当中一行的第一个元素是否比target大,如果是的话,那么就没有继续比下去的必要了,因为后面的数必然都比target大,直接返回false。
否则,对这一行进行二分搜索。我们采用左闭右开的方式进行搜索,如果nums[l] == target,则返回true。否则继续去下一行进行比对与二分搜索。
一个优化是,可以首先让target与这一行的首尾元素进行比较。如果target在首尾元素构成的闭区间当中,再进行二分搜索。
完整的 Swift 题解是:
swift
class Solution {
func searchMatrix(_ matrix: [[Int]], _ target: Int) -> Bool {
var m = matrix.count
var n = matrix[0].count
for i in 0..<m {
if target < matrix[i][0] {
return false
} else {
var l = 0, r = n - 1
while l < r {
var mid = (l + r) / 2
if matrix[i][mid] < target {
l = mid + 1
} else {
r = mid
}
}
if matrix[i][l] == target {
return true
}
}
}
return false
}
}