题目要求
在一个有序的二维数组中,查找某一个值是否在二维数组中。
有序的二维数组,指的的是在每一行的数据都是从左到右递增的,每一列都是从上到下递增的,在这个有序的二维数组中查找某一个值是否在。
思路
假设二维数组是如下图,查找 7 是否在二维数组中
1.这种查找起始位置在右上角的方式,也可以此时从左下角的位置开始查找
代码实现
package com.offer.test;
/**
* 在一个有序的二维数组中,查找某一个值是否在二维数组中
* [{ 1, 2, 8, 9 }
* { 2, 4, 9, 12 }
* { 4, 7, 10, 13 }
* { 6, 8, 11, 15 }]
* @author zhouwenchen@021.com
* @date 2019年6月12日 下午4:27:17
*/
public class Find {
/**
* 默认选取的是右上角的数字
* @param arr
* @param key
* @return
*/
public static boolean find(int[][] arr, int key) {
if (arr == null || arr.length <= 0) {
return false;
}
// 先获取到 二维数组中的右上角的值
int colum = arr[0].length - 1;
int row = 0;
while (row < arr.length && colum > 0) {
if (arr[row][colum] == key) { // 如果二维数组中的某一个位置的值等于查找的目标值,直接返回
return true;
}
if (arr[row][colum] > key) { 如果查找的值大于二维数组中此位置的值,那就 列加+1,否则 行加 +1
colum--;
} else {
row++;
}
}
return false;
}
/**
* 默认选择的是左下角的数字
* @param arr
* @param i
* @return
*/
private static boolean find2(int[][] arr, int key) {
if (arr == null || arr.length < 0) {
return false;
}
// 选择二维数组中的左下角的值
int row = arr[0].length - 1;
int colum = 0;
while (row > 0 && colum < arr.length) {
if (arr[row][colum] == key) {
return true;
}
if (arr[row][colum] < key) { 如果查找的目标值大于此位置的值,那就列加1 否则行-1.
colum++;
} else {
row--;
}
}
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 } };
// boolean result = find(arr,16);
boolean result = find(arr,7);
System.out.println(result);
}
}