Search a 2D Matrix(在二维数组中查找)

61 篇文章 10 订阅
7 篇文章 0 订阅

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.

LeetCode上的一道题,这个题比较特殊,如果从二维数组在内存中的存储来看,其实是一个排序的一位数组(自行查阅二维数组在内存的顺序)。所以肯定搞个二分查找就OK了。但是可以先探讨其他方案。

方案1:由于本人审题比较轻率,没有看到本行第一个比上一行最后一个大的条件,看成了本行第一个比上一行第一个大。显然如果这样的话,就会更难处理:

我的方案是先按第一列处理,二分查找找到行,然后行内二分查找。渣代码如下:

public boolean searchMatrix1(int[][] matrix, int target) {
    	int low = 0;
        int high = matrix.length-1;
        int mid = 0;
        while (low <= high) {
        	mid = low + (high-low)/2;
        	if (matrix[mid][0] <= target && target <= matrix[mid][matrix[mid].length-1]) {
        		break;
        	} else if (matrix[mid][matrix[mid].length-1] < target){
        		low = mid +1;
        	} else if (matrix[mid][0] > target){
        		high = mid -1;
        	}
        }
        int row = mid;
        low = 0;
        high = matrix[row].length-1;
        while (low <= high) {
        	mid = low + (high-low)/2;
        	if (matrix[row][mid] == target) {
        		return true;
        	} else if (matrix[row][mid] < target) {
        		low = mid+1;
        	} else {
        		high = mid -1;
        	}
        }
        return false;
    }
其实时间复杂度也就O(lgn+lgm);也算挺快的。

但是由于本题的特殊之处,直接按一维数组处理,渣代码如下:

public boolean searchMatrix(int[][] matrix, int target) {
		int row = matrix.length;
		int col = matrix[0].length;
		int low = 0; 
		int high = row * col -1;
		while (low <= high) {
			int mid = low + (high-low)/2;
			int num = matrix[mid/col][mid%col];
			if (num == target) {
				return true;
			} else if (num < target) {
				low = mid+1;
			} else {
				high = mid-1;
			}
		}
		return false;
    }

时间复杂度O(lg(m+n));但是由于现在计算机缓存的问题,其实速度没有提升多少。

再看剑指offer的一道题目:

在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上往下递增的顺序排序。请写一个函数,输入一个二维数组和一个整数,判断数组中是否含有该整数。

例如下面的二维数组就是每行、每列都是递增顺序,如果在这个数组中查找数字7,则返回true,如果查找数字5,由于数组中不含有该数字,则返回false。

1   2   8   9

2  4   9   12

4  7  10   13

6  8   11   15

public boolean find(int[][] matrix, int number) {
		if (matrix != null && matrix.length > 0 && matrix[0].length > 0) {
			int rows = matrix.length;
			int columns = matrix[0].length;
			int row = 0;
			int col = columns-1;
			while (row < rows && col >= 0) {
				int temp = matrix[row][col];
				if (number > temp) {
					row++;
				} else if (number < temp) {
					col--;
				} else {
					return true;
				}
			}
		}
		return false;
	}

时间复杂度是多少?O(m+n),岂不是还没有我开始第一种方法效率高?





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值