题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true;如果查找数字5,由于数组不含有该数字,则返回false。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
思路一:
从右上角开始搜索,大于7的话,继续搜索前一列,所以是column--;小于7的话,继续搜索下一行,所以是row++。
package offer;
import java.util.Scanner;
public class Solution4 {
public boolean Find(int target, int[][] array) {
if (array == null || array.length <= 0)
return false;
int rows = array.length;
int columns = array[0].length;
int column = columns - 1;
int row = 0;
while (column >= 0 && row < rows) {
if (array[row][column] > target) {
column--;
} else if (array[row][column] < target) {
row++;
} else {
return true;
}
}
return false;
}
public static void main(String[] args) {
Solution4 sl = new Solution4();
Scanner scanner = new Scanner(System.in);
int target = scanner.nextInt();
int[][] array = new int[4][4];
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
array[i][j] = scanner.nextInt();
}
}
scanner.close();
System.out.println(sl.Find(target, array));
}
}
思路二:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(nlogn)。
链接:https://www.nowcoder.com/questionTerminal/abc3fe2ce8e146608e868a70efebf62e
来源:牛客网
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;
}
}