您的位置:首页 > 职场人生

剑指Offer(第二版)面试题4:二维数组中的查找

2017-05-08 22:19 417 查看
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/71436631冷血之心的博客)



显然该题可以使用暴力遍历的方法解决,然而如果你进行暴力,那么你肯定拿不到Offer
通过优化,可以达到O(N)的复杂度,相当漂亮。
/*
* 剑指Offer面试题4:二维数组中的查找
* 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
* 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
*/
public class Test {

public static void main(String[] args) {
// int[][] arr = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
int[][] arr = {{1,2,8},{2,4,9},{4,7,10},{6,8,11}};
// int[][] arr = {{},{},{},{}};
// int[][] arr = null;
System.out.println(arr.length);
// System.out.println(findTarget2(arr, 67));

}

/**
* 方法1:暴力遍历(玩个蛋,太慢)
* 总的时间复杂度是O(N的二次方)
* @param arr
* @return
*/
private static boolean findTarget(int[][] arr,int target){
// 判断输入数据的合法性
if(arr==null)
return false;
for (int i=0; i<arr.length; i++) {
for (int j=0; j<arr[i].length; j++) {
if (arr[i][j] == target)
return true;
}
}
return false;
}

/**
* 方法2:通过选取右上角或者左下角的元素进行比较,从而达到每次比较都可以去掉一行或者一列的效果
* 总的时间复杂度是O(N)
* @param arr
* @return
*/
private static boolean findTarget2(int[][] arr,int target){
// 判断输入数据的合法性
if(arr==null)
return false;
int row = 0;
int col = arr[0].length-1;
int numRow = arr.length; // 二维数组的行数
while(row<numRow&&col>=0){
if(arr[row][col]>target)
col--; // 去掉该列
else if (arr[row][col]<target) {
row++; // 去掉该行
}else
return true;
}
return false;
}
}该题主要是寻找规律,选择右上角或者左下角都可以达到缩小查找范围的效果,从而使得时间复杂度下降到O(N)

如果对你有帮助,记得点赞哦~欢迎大家关注我的博客,可以进群366533258一起交流学习哦~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: