剑指offer01——二维数组中的查找
一、 题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
二、解题方法
1.暴力遍历法
此处开头无需判断二维数组是否为空
public class Solution {
//暴力遍历法
public boolean Find(int target, int [][] array) {
int rows = array.length;
int cols = array[0].length;
for(int i=0; i<rows; i++){
for(int j=0; j<cols; j++){
if(array[i][j] == target)
return true;
}
}
return false;
}
}
2.折半查找法(有技巧)
注意:考虑到数组从左到右递增,从上到下递增。有序的数组,就要想到二分法。
public class Solution {
//从右上角开始找,删除一行或者一列
public boolean Find(int target, int [][] array) {
//先判断如果数组为空的情况
int rows = array.length;
if(rows == 0)return false;
int cols = array[0].length;
if(cols == 0)return false;
//右上角元素为mid位置
int row = 0;
int col = cols-1;
while(row<rows && col>=0){
if(target > array[row][col]){
row++;
}else if(target < array[row][col]){
col--;
}else {
return true;
}
}
return false;
}
}
三、额外小知识
1.判断二维数组为空的情况
要判断以下三种情况:
1)二维数组首地址是否为空,即array == null;
2) 二维数组是否为{ } ,即array.length == 0;
3)二维数组是否为{{}},即array.length == 1 && array[0].length == 0的情况
综上,条件为:if((array == null) || (array.length == 0) || (array.length1 && array[0].length0))
2.java中length,length(),size()的区别
使用length属性获取数组的长度
使用length()方法获取字符串的长度
使用size()方法获取泛型集合中有多少元素
//数组用length属性取得长度
int ar[] = new int{1,2,3}
int lenAr = ar.length;//此处lenAr=3
System.out.println("Arr length:"+lenAr);
//length()方法:用于获取字符串长度。
String str = "Hello World Java";
int lenStr = str.length();//此处lenStr=16
System.out.println("Str length():"+lenStr);
//size()方法:用于获取泛型集合有多少个元素。
Collection<String> col = new ArrayList<String>();
col.add("Hello");
col.add("World");
col.add("Java");
int sizeCol = col.size();//此处sizeCol=3
System.out.println("Col size:"+sizeCol);