func searchMatrix(matrix [][]int, target int) bool {
x := -1
for i := 0; i < len(matrix); i++ {
if matrix[i][len(matrix[i])-1] >= target {
x = i
break
}
}
if x == -1 {
return false
}
for i := 0; i < len(matrix[0]); i++ {
if matrix[x][i] == target {
return true
}
}
return false
}
当然,我们可以在一行内用二分法查找:
Go复制代码
func searchMatrix(matrix [][]int, target int) bool {
x := -1
for i := 0; i < len(matrix); i++ {
if matrix[i][len(matrix[i])-1] >= target {
x = i
break
}
}
if x == -1 {
return false
}
l, r := 0, len(matrix[x])-1
for l <= r {
mid := l + (r-l)/2
if matrix[x][mid] == target {
return true
}
if matrix[x][mid] < target {
l = mid + 1
} else {
r = mid - 1
}
}
return false
}
第一步暴力逻辑也可以改为二分查找:
Go复制代码
func searchMatrix(matrix [][]int, target int) bool {
l, r := 0, len(matrix)-1
for l <= r {
mid := l + (r-l)/2
if matrix[mid][0] == target {
return true
}
if matrix[mid][0] < target {
l++
} else {
r--
}
}
if r < 0 {
return false
}
x := r
l, r = 0, len(matrix[x])-1
for l <= r {
mid := l + (r-l)/2
if matrix[x][mid] == target {
return true
}
if matrix[x][mid] < target {
l = mid + 1
} else {
r = mid - 1
}
}
return false
}
如果将每一行都接在前一行的末尾,那么将是一个一维的有序数组:
Go复制代码
func searchMatrix(matrix [][]int, target int) bool {
h, w := len(matrix), len(matrix[0])
l, r := 0, h*w-1
for l <= r {
mid := l + (r-l)/2
if matrix[mid/w][mid%w] == target {
return true
}
if matrix[mid / w][mid % w] < target {
l++
}else {
r--
}
}
return false
}