5-二分-索引二分-搜索二维矩阵

这是索引二分的第五篇算法,力扣链接

给你一个满足下述两条属性的 m x n 整数矩阵:

  • 每行中的整数从左到右按非严格递增顺序排列。
  • 每行的第一个整数大于前一行的最后一个整数。

给你一个整数 target ,如果 target 在矩阵中,返回 true ;否则,返回 false 。

示例 1:

输入:matrix = [[1,3,5,7],[10,11,16,20],[23,30,34,60]], target = 3
输出:true

这道题在之前的专栏其实讲过,这里在这里复习一下。

老规矩,先上暴力求解,具体怎么暴力呢?先确定数据在第几行,怎么确定呢?

matrix[x+1][len(matrix[0]-1] > target > matrix[x][len(matrix[0]-1]

然后再在该行暴力查找,直接上代码:

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
}

当然,我们可以在一行内用二分法查找:

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
}

第一步暴力逻辑也可以改为二分查找:

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
}

如果将每一行都接在前一行的末尾,那么将是一个一维的有序数组:


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
}

这终究都属于暴力解法,我们可以试试Z字查找,从[0][len(maxtrix[0]]开始,大了就往左移动,小了就往右移动。

func searchMatrix(matrix [][]int, target int) bool {
	h, w := 0, len(matrix[0])-1
	for h < len(matrix) && w >= 0 {
		if matrix[h][w] == target {
			return true
		}
		if matrix[h][w] > target {
			w--
		} else {
			h ++
		}
	}
	return false
}

相关推荐

  1. 搜索矩阵二分

    2023-12-09 10:52:02       63 阅读
  2. 搜索矩阵 II【矩阵】【二分

    2023-12-09 10:52:02       62 阅读
  3. E : B DS二分查找_搜索矩阵

    2023-12-09 10:52:02       57 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 10:52:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 10:52:02       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 10:52:02       82 阅读
  4. Python语言-面向对象

    2023-12-09 10:52:02       91 阅读

热门阅读

  1. LinuxBasicsForHackers笔记 -- 日志系统

    2023-12-09 10:52:02       53 阅读
  2. CFD仿真流程

    2023-12-09 10:52:02       53 阅读
  3. 基于IText7 PDF模板填充?

    2023-12-09 10:52:02       58 阅读
  4. chatgpt、百度、讯飞、阿里写一小段SQL对比

    2023-12-09 10:52:02       60 阅读
  5. 利用C++面向对象范式编程求矩形面积 ← 类

    2023-12-09 10:52:02       57 阅读
  6. EAS BOS:Unsupported major.minor version 51.0

    2023-12-09 10:52:02       57 阅读
  7. printf二进制输出

    2023-12-09 10:52:02       51 阅读
  8. Docker 安装 Centos和宝塔

    2023-12-09 10:52:02       57 阅读
  9. Linux中用bash写脚本

    2023-12-09 10:52:02       39 阅读
  10. 关于torch.nn.Embedding的浅显理解

    2023-12-09 10:52:02       58 阅读