在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    1. public class Solution {
    2. public boolean Find(int target, int [][] array) {
    3. //行数
    4. int row = array.length;
    5. if(row == 0) return false;
    6. int low = array[0].length;
    7. //列数
    8. if(low == 0) return false;
    9. //一行一行比
    10. for(int i = 0; i < row; i++){
    11. //在第i行找target
    12. if(array[i][0]<=target && target<=array[i][low-1]){
    13. for(int j = 0;j< low; j++){
    14. if(target == array[i][j]){
    15. return true;
    16. }
    17. }
    18. }
    19. }
    20. return false;
    21. }
    22. }

    两种思路
    一种是:
    把每一行看成有序递增的数组,
    利用二分查找,
    通过遍历每一行得到答案,
    时间复杂度是nlogn

    1. public class Solution {
    2. public boolean Find(int [][] array,int target) {
    3. //一行一行判断
    4. for(int i=0;i<array.length;i++){
    5. int low=0;
    6. int high=array[i].length-1;
    7. while(low<=high){
    8. int mid=(low+high)/2;
    9. if(target>array[i][mid])
    10. low=mid+1;
    11. else if(target<array[i][mid])
    12. high=mid-1;
    13. else
    14. return true;
    15. }
    16. }
    17. return false;
    18. }
    19. }

    另外一种思路是:
    利用二维数组由上到下,由左到右递增的规律,
    那么选取右上角或者左下角的元素a[row][col]与target进行比较,
    当target小于元素a[row][col]时,那么target必定在元素a所在行的左边,
    即col—;
    当target大于元素a[row][col]时,那么target必定在元素a所在列的下边,
    即row++;

    1. public class Solution {
    2. public boolean Find(int [][] array,int target) {
    3. int row=0;
    4. int col=array[0].length-1;
    5. while(row<=array.length-1&&col>=0){
    6. if(target==array[row][col])
    7. return true;
    8. else if(target>array[row][col])
    9. row++;
    10. else
    11. col--;
    12. }
    13. return false;
    14. }
    15. }