编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
示例 1:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true
示例 2:
输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 13
输出:false
提示:
- m == matrix.length
- n == matrix[i].length
- 1 <= m, n <= 100
- -104 <= matrix[i][j], target <= 104
解答:
func searchMatrix(matrix [][]int, target int) bool {
flag := false
m, n := len(matrix), len(matrix[0])
l := m * n
if l == 0 {
return false
}
row := -1
for i := 0; i < m; {
j := m / 2
if matrix[j][0] > target {
m = j
} else if matrix[j][0] < target {
i = j
} else {
row = i - 1
break
}
}
if row < 0 {
return false
}
for i := 0; i < n; {
j := n / 2
if matrix[row][j] > target {
n = j
} else if matrix[row][j] < target {
i = j
} else {
flag = true
break
}
}
return flag
}
又超时了
官方解答:
1.两次二分查找
func searchMatrix(matrix [][]int, target int) bool {
row := sort.Search(len(matrix), func(i int) bool { return matrix[i][0] > target }) - 1
if row < 0 {
return false
}
col := sort.SearchInts(matrix[row], target)
return col < len(matrix[row]) && matrix[row][col] == target
}
2.一次二分查找
func searchMatrix(matrix [][]int, target int) bool {
m, n := len(matrix), len(matrix[0])
i := sort.Search(m*n, func(i int) bool { return matrix[i/n][i%n] >= target })
return i < m*n && matrix[i/n][i%n] == target
}