在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
两个思路。
1.
先列二分,再从上到下每行遍历二分法。
2.
一种从左下角开始,小的上移,大的右移。
//1.列二分,遍历列,行二分:
public class Solution {
public boolean Find(int target, int [][]array) {
int col = array [0].length;//列
int cur = array.length;//行
boolean Final = false;
int cur_min = 0;
int cur_max = cur - 1;
int col_min = 0;
int col_max = col - 1;
while(cur_min<cur_max){
int mid =(cur_min+cur_max)/2;
if((array[cur_max][col_min]>target)&&(array[mid][col_min]>target)){
cur_max = mid - 1;
continue;
}elseif(array[cur_max][col_min]==target){
return true;
}else{
//cur_min = cur_max;
break;
}
}
int temp1 = col_min;
int temp2 = col_max;
for(int i = 0;i<=cur_max;i++){
while(col_min<=col_max){
intmid = (col_min+col_max)/2;
if((array[i][col_max]>target)&&(array[i][mid]<target)){
col_min = mid + 1;
continue;
}elseif((array[i][col_max]>target)&&(array[i][mid]>target)){
col_max= mid - 1;
continue;
}elseif(((array[i][col_max]>target)&&(array[i][mid]==target))||(array[i][col_max]==target)){
return true;
}else{
break;
}
}
col_min= temp1;
col_max= temp2;
}
return false;
}
}
//2.
一种从左下角开始,小的上移,大的右移。
Public
class
Solution {
public
boolean
Find(int
[][] array,int
target) {
for(int
i=0;i<array.length;i++){
int
low=0;
int
high=array[i].length-1;
while(low<=high){
int
mid=(low+high)/2;
if(target>array[i][mid])
low=mid+1;
else
if(target<array[i][mid])
high=mid-1;
else
return
true;
}
}
return
false;
}
}
public class Solution {
public static boolean Find(int target, int[][] array) {
intlen = array.length-1;
intcol = array[0].length-1;
int i = 0;
while(len>=0&&i<=col){
if(array[len][i]>target){
len--;
continue;
}elseif(array[len][i]<target){
i++;
continue;
}else{
returntrue;
}
}
return false;
}
}