LeetCode240.二维矩阵搜索

题目

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

每行的元素从左到右升序排列。

每列的元素从上到下升序排列。

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

提示:

m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-109 <= matix[i][j] <= 109
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-109 <= target <= 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-a-2d-matrix-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题方法

暴力破解

时间复杂度O(mn) m*n的矩阵
空间复杂度O(1)

搜索

时间复杂度O(m+n)每次如果没有搜索到元素返回true,行和列递增或递减,循环结束前不超过m+n次。
空间复杂度O(1)
出发点的选取: 
    左上角:往左或者往右都是增大,所以不能选取
    右上角:往左减小往右增大,可选
    左下角:往上减小往右增大,可选
    右下角:往左或者网上都是减小,所以不能取

代码

// 暴力破解
func searchMatrix(matrix [][]int, target int) bool {
	row := len(matrix)
	col := len(matrix[0])
	for i := 0;i < row;i++{
		for j := 0;j < col;j++{
			if matrix[i][j] == target{
				return true
			}
		}
	}
	return false
}

// 搜索 以左下角为起点
func searchMatrix2(matrix [][]int, target int) bool {
	if len(matrix) == 0{
		return false
	}
	row := len(matrix)-1
	col := len(matrix[0])
	index := 0
	// 左下角为起点进行搜索,行列索引越界时结束
	for row >= 0 && index < col{
		// 当前元素等于搜索元素返回true
		if matrix[row][index] == target{
			return true
		}
		// 如果当前元素大于搜索元素,向上移动一行,否则向右移动一列
		if matrix[row][index] > target {
			row--
		}else{
			index++
		}
	}
	return false
}
原文地址:https://www.cnblogs.com/hzpeng/p/15087093.html