LeetCode 74 搜索二维矩阵

编写一个高效的算法来判断 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
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注