因为以后想找一份实习,所以要开始为实习的考试做准备了。看的是剑指offer的题目。
题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
1.暴力破解
2.从左下查找
3.从右上查找
4.为什么不在左上或者右下查找
暴力破解
暴力破解就是直接循环求解
public class Solution {
public boolean Find(int target, int [][] array) {
for(int i=0;i<array.length;i++){
for(int j=0;j<array[i].length;j++){
if(target == array[i][j]){
return true
}
}
}
return false
}
}
时间复杂度:O(n²)
空间复杂度:O(1)
从左下找
按照从左到右递增和从上到下递增的特性。
如果一个数字比一行最右边的数字大,即可以直接检索下一行。
即一次检索可以排除一行或者一列。
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;
}
int row = rows - 1;
int col = 0;
while(row >= 0 && col <cols){
if(array[row][col] < target){
col++;
}else if(array[row][col] > target){
row--;
}else{
return true;
}
}
return false;
}
}
时间复杂度:O(行宽+列高)
空间复杂度:O(1)
从右上找
和从左下找是一样的思路。不过是从右上开始查找。
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;
}
int row = 0;
int col = cols - 1;
while(row < rows && col >= 0){
if(array[row][col] < target){
row++;
}else if(array[row][col] > target){
col--;
}else{
return true;
}
}
return false;
}
}
时间复杂度:O(行宽+列高)
空间复杂度:O(1)
为什么不在左上和右下查找?
因为这个数列是从左到右,从上到下递增。如果从左边第一行第一个开始检索,或者右边最后一行最后一个开始检索。就无法像左下右上一样,一次检索就排除一行或者一列。