总结排序(或部分排序)矩阵上的搜索问题

本文总结了在排好序或部分排好序的矩阵上进行搜索的问题,包括LeetCode和CareerCup的经典题目。讨论了不同的搜索策略,如沿着对角线线性查询、部分二分搜索以及寻找矩阵中第K小的元素。并分析了各种方法的时间复杂度,如O(M+N)、O(M*logN)和O(K*logK)等。
摘要由CSDN通过智能技术生成

在排好序(或者部分排好序)的矩阵上进行搜索是考察多维数组操作和查找的一种经典面试题类型。这里假设行数和列数分别是M和N。下面根据难度来总结一下几个不同的题目变体:


1. LeetCode原题 Search a 2D Matrix:

Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

  • Integers in each row are sorted from left to right.
  • The first integer of each row is greater than the last integer of the previous row.

For example,

Consider the following matrix:

[
  [1,   3,  5,  7],
  [10, 11, 16, 20],
  [23, 30, 34, 50]
]

Given target = 3, return true.

这题非常的基础,特别简单,因为题目对排序的要求特别的严格,整个矩阵按行完全排好序。利用排序性质,二分搜索的思路非常清晰。


思路1:首先二分搜索确定行号,然后再二分搜索确定列号。

	public boolean Find(int[][] matrix, int elem) {
		// binary search the row number
		int low, high, mid = 0;
		low = 0;
		high = matrix.length - 1;

		while (low <= high) {
			mid = low + (high - low) / 2;
			if (matrix[mid][0] == elem) {
				return true;
			} else if (matrix[mid][0] > elem) {
				high = mid - 1;
			} else {
				low = mid + 1;
			}
		}

		// make sure the row starts with a 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值