自学算法之二维数组的查找

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37014990/article/details/79996351

题目:

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

好了,看完题目,我们再看看例子:

数组arr满足题目要求:

1   2    3    5

5   6    7    8

9  10  11  12

笔者看到这种题,不觉摸了摸发际线下的额头,心想:讲道理,这题也太简单了吧?

于是,笔者内心是波澜的:

波澜一,使用蛮力法,无脑遍历该二维数组,逐一对比,将待查找的数与数组项比较,相等就返回true,不等继续。

好吧,笔者承认是为了省事儿,选择了该方法.....

but ......

好奇心作祟,google了一波,发现......神仙都不会直接遍历数组。

好吧,确实有更好的办法。

毕竟让笔者承认自己不足,需要很大的勇气。

花费许久,才看懂神仙的思维,心湖掠起一阵波涛。

波涛二,从二维数组右上角观察数组arr:

1   2    3    5     |||

5   6    7    8     |||

9  10  11  12    |||

假设我们查找数字6,从右上角5开始。

明显,6  > 5。而数字6可定大于数字5所在的行,所以,去掉数字5所在的行,即:

5   6    7    8     |||

9  10  11  12    |||

继续从右上角数字8开始。

明显 6  < 8 。所以,数字6肯定小于8所在的列,所以去掉数字8所在的列,即:

5   6    7         |||

9  10  11        |||

依次类推:......最终会变成这样。所以,数字6存在该二维数组中。

5   6          |||

9  10         |||

	public static boolean findNumber(int[][] arr, int num){
		//参数检查
		if(arr == null) return false;
		//查找标志
		boolean success = false;
		//右上角数值的行
		int tempRow = 0;
		//右上角数值的列
		int tempColumn = arr[0].length - 1;
		while(tempRow > 0 && tempColumn >= 0){
			if(arr[tempRow][tempColumn] == num){
				success = true;
				break;
			}else if(arr[tempRow][tempColumn] < num){
				tempRow++;
			}else if(arr[tempRow][tempColumn] > num){
				tempColumn--;
			}else{
				return false;
			}
		}
		return success;
	}


猜你喜欢

转载自blog.csdn.net/qq_37014990/article/details/79996351