欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

二维数组中的查找

程序员文章站 2022-03-14 23:20:22
...

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

例如:下面的二位数组都是每行梅列递增,如果在这个数组中查找数字7,如果有就返回true,如果没有就返回fasle。

    1   2   8    9

     2  4   9   10

     4  7  10  13

     6  8  11   15

思路:1.选取数组的右上角的数字比较,9比7大,那么9这一列中9最小都没有比7小那么,在这一列中没有比7小的了。那么这一行可以不考虑了,剔除掉9所在这一列(图a)。看剩下的,最右上角,那么就是不8,同理剔除8所在的这一列(图b),剩下的就是这个右上角是2,明显比7小,那么在剔除完,其余的后,发现,第一列中2最大,最大的数没有7大,那么这一行也可以剔除(图c)第二行,此时,数组中只剩下了四个数字,依旧是最右上角的数字,刚好是7,就一比较结束(图d)。 

二维数组中的查找

总结一下,那就是每次拿右上角的数字和要查找得数字比较,大于则剔除列,小于则剔除行。实现这么一个函数就可以了。当然也可以从左下角开始查找,道理一样。

java代码如下:

package com.cb.java.algorithms.jianzhioffer;

/**
 * 在二维数组中查找数字
 * 
 * @author
 *
 */
public class FindNumberInTwoDimensionArray {

	/**
	 * 从右上角开始查找
	 * 
	 * @param arr
	 * @param num
	 * @return
	 */
	public static boolean findFromRightUp(int[][] arr, int num) {
		int row = 0;
		int col = arr[0].length - 1;
		while (row <= arr.length - 1 && col >= 0) {
			if (arr[row][col] == num) {
				System.out.println("第" + (row + 1) + "行" + (col + 1) + "列");
				return true;
			} else if (arr[row][col] > num) {
				--col;
			} else {
				++row;
			}

		}
		return false;
	}

	/**
	 * 从左下角开始查找
	 * 
	 * @param arr
	 * @param num
	 * @return
	 */
	public static boolean findFromLeftDown(int[][] arr, int num) {
		int row = arr[0].length - 1;
		int col = 0;
		while (col <= arr.length - 1 && row >= 0) {
			if (arr[row][col] == num) {
				System.out.println("第" + (row + 1) + "行" + (col + 1) + "列");
				return true;
			} else if (arr[row][col] > num) {
				--row;
			} else {
				++col;
			}

		}
		return false;
	}

	public static void main(String[] args) {
		int[][] arr = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
		findFromRightUp(arr, 7);
		findFromLeftDown(arr, 9);
	}
}

在上述查找过程中,可以从左下角或者右上角开始查找,但不能从左上角或者右下角开始查找。以左上角数字为例,最初数字为1,由于1小于7,那么7应该位于1得右边或者下边。此时不能从查找范围内剔除1所在的行,也不能剔除1所在的列,无法缩小查找范围。

参考:

[1]《剑指Offer》

[2]https://blog.csdn.net/qq_35256722/article/details/53691946