第一天开始刷剑指offer里面的题目:
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 行的二分法
- 列的二分法
- 区域二分法
二维数组相关知识:
行长度:array.length
列长度:array[i].length
二维数组int array[][] = new int[3][3]; //先行[ ]后列[ ]
class Test
{
for(int i = 0; i < array.length; i++
{
for(int j = 0; j < array[i].length; j++)
{}
}
}
行的二分法
public boolean Find2(int target, int [][] array)
{
/*
第一种思路:
对每一行使用二分法,找到目标返回true,否则false;
*/
for(int i=0;i<array.length;i++)
{
int low = 0;//列最低位置
int hig = array[i].length-1;//列最高位置
while(low<=hig)
{
int mid = (low+hig)/2;
if(target < array[i][mid])
{
hig = mid - 1;
}
else if(target > array[i][mid])
{
low = mid + 1;
}
else//相等时
{
return true;
}
}
}
return false;//超过边界时
}
列的二分法
public boolean Find1(int target,int [][] array)
{
/*
第二种思路:
对每一列使用二分法,找到目标返回true,否则false;
*/
for(int i=0;i<array[0].length;i++)
{
int Lef = 0;//行左边
int Rig = array.length-1;//行右边
while(Lef<=Rig)
{
int Mid = (Lef+Rig)/2;
if(target < array[Mid][i])
{
Rig = Mid-1;
}
else if(target > array[Mid][i])//行位置,列位置
{
Lef = Mid+1;
}
else//相等时
{
return true;
}
}
}
return false;//超过边界时
}
区域二分法
利用二维数组由上到下,由左到右递增的规律,
那么选取右上角或者左下角的元素a[row][col]与target进行比较,
(1)当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col- -;
(2)当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;
public boolean Find(int target ,int[][] array)
{
/*
第三种思路:
取左下角或者右上角作为标准,比它大—>往右边取,比它小—>往上面取,超过边界时返回false。
*/
//右上角
int rows = array.length;
int cols = array[0].length;
int i = rows - 1;//行
int j = 0;//列
while(i>=0 && j<cols)
{
if(target < array[i][j])
{
i--;
}
else if(target > array[i][j])
{
j++;
}
else//相等时
{
return true;
}
}
return false;//超过边界时
}
总结:
通过这道题了解到了二维数组中的行和列的关系,也重复练习二分法的使用方式,但注意二分法必须在有序的数组中才能使用。