1、题目
2、思路
①利用二分查找,遍历其中的每一行,每一行都使用二分查找的方式
②上面的方法不符合题目的要求,使用变体的二分查找:来自题解
3、代码
① 第一种方式的代码:
public class Solution {
public boolean Find(int target, int [][] array) {
boolean tag = false;
for(int i = 0 ; i<= array.length-1;i++){
tag = binary(array[i],target);
if(tag){
break;
}
}
return tag;
}
public boolean binary(int[] nums,int target){
int left = 0;
int right = nums.length -1;
int mid = 0;
while(left<=right){
mid = (left+right)/2;
if(nums[mid] == target){
return true;
}
if(nums[mid] < target){
left = mid+1;
}
if(nums[mid] > target){
right = mid-1;
}
}
return false;
}
}
②第二种方式的代码
public class Solution {
public boolean Find(int target, int [][] array) {
// 利用二维数组由上到下,由左到右递增的规律,
// 那么选取右上角或者左下角的元素a[row][col]与target进行比较,
// 当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
// 即col--;
// 当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
// 即row++;
int row=0;
int col=array[0].length-1;
while(row<=array.length-1&&col>=0){
if(target==array[row][col])
return true;
else if(target>array[row][col])
row++;
else
col--;
}
return false;
}
}