"微信公众号"
题目连接:
题目:
解题思路:
(1)循环遍历整个二维数组,进行比较。时间复杂度为O(n^2)。
//时间复杂度是O(n^2)
public static boolean Find(int target,int[][] array) {
int row = array.length;
int col = array[row].length;
for(int i=0; i<row; i++) {
for(int j=0; j<col; j++) {
if(array[i][j]==target) {
return true;
}
}
}
return false;
}
(2)把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(NlogN)。
//时间复杂度为O(nlogn)
public static boolean Find(int target,int[][] array) {
int row = array.length;
for(int i=0; i<row; i++) {
int high = array[i].length-1;
int low =0;
while(low<=high) {
int mid = (low+high)/2;
if(array[i][mid]==target)
return true;
else if(array[i][mid]<target) {
low = mid +1;
}else {
high = mid -1;
}
}
}
return false;
}
(3)由于二维数组由上到下,由左到右递增的规律,那么选取右上角或者左下角的元素a[row][col]与target进行比较,当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,即col--;当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,即row++;
public boolean Find(int target, int [][] array) {
int row = array.length;
int col = array[0].length;
int i = row-1;
int j = 0;
while(i>=0&&i<row&&j<col) {
if(array[i][j]==target) {
return true;
}else if(array[i][j]>target){
i--;
}else {
j++;
}
}
return false;
}