《剑指Offer》总目录
一、题目描述
在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、解题思路
如题描述,每一列都按照从上到下递增的顺序排序,每一行都按照从左到右递增的顺序排序。既每一行和每一列都是排序的。针对排序的元素数组中,用二分法无疑是比较好的算法。我是先查找每一行,如果这一行元素的第一个元素比要查找的元素大,就没有必要再查找这一行的元素。如果比它小,就使用二分法查找该元素。
三、代码描述
package com.acm.Secondmonth;
public class Test03 {
/**
* 二分查找
* 首先从列开始 只要比该列的第一个元素大,就表示可以搜索这一行
*
* @param matrix
* @param i
* @return
*/
private static boolean find(int[][] matrix, int k) {
if(matrix == null) {
throw new RuntimeException("invaild input! the array is null!");
}
for(int i=0 ; i<matrix.length ; i++) {
if(matrix[i][0] < k) {
if(binarySearch(matrix[i] , k)) {
return true;
}
}else if(matrix[i][0] == k) {
return true;
}
}
return false;
}
public static boolean binarySearch(int[] num , int k) {
int start =0 , end = num.length-1;
while(start <= end) {
int mid = (end+start)/2;
if(num[mid] > k) {
end = mid-1;
}else if(num[mid] < k) {
start = mid+1;
}else {
return true;
}
}
return false;
}
public static void main(String[] args) {
int[][] matrix = {
{1, 2, 8, 9},
{2, 4, 9, 12},
{4, 7, 10, 13},
{6, 8, 11, 15}
};
System.out.println(find(matrix, 7)); // 要查找的数在数组中
System.out.println(find(matrix, 5)); // 要查找的数不在数组中
System.out.println(find(matrix, 1)); // 要查找的数是数组中最小的数字
System.out.println(find(matrix, 15)); // 要查找的数是数组中最大的数字
System.out.println(find(matrix, 0)); // 要查找的数比数组中最小的数字还小
System.out.println(find(matrix, 16)); // 要查找的数比数组中最大的数字还大
System.out.println(find(null, 16)); // 健壮性测试,输入空指针
}
}