二位数组中的查找

题目描述

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

思路:

1.效率最低–一个一个查
时间复杂度O(n的平方),空间复杂度O(1)

public class Solution {
    public boolean Find(int x,int numbers[][]){
        if(numbers==null||numbers.length<=0){
            return false;
        }
        for(int i=0;i<numbers.length-1;i++){
            for(int j=0;j<numbers[i].length-1;j++){
                 if(numbers[i][j]>numbers[i+1][j]){
                    return false;
                }
                if(numbers[i][j]>numbers[i][j+1]){
                    return false;
                }
            }
             
        }
         for(int m=0;m<numbers.length;m++){
            for(int n=0;n<numbers[m].length;n++){
                if(numbers[m][n]==x){
                    return true;
                }
            }    
        }
        
        return false;
    }
}

2.利用二维数组由上到下,由左到右递增的规律,那么选取左下角或者右上角的元素a[i][j]与target进行比较,若两者相等,查找结束;如果a[i][j]<target则target必定在元素a所在行的右边,即j++;当target小于元素a[i][j]时,那么target必定在元素a所在列的上边,即i–;时间复杂度O(m+n)
2.1每次都选择数组查找范围内的最右上角的数字

  public boolean Find(int x,int numbers[][]){
        if(numbers==null||numbers.length<=0){
            return false;
        }
        for(int i=0;i<numbers.length-1;i++){
            for(int j=0;j<numbers[i].length-1;j++){
                 if(numbers[i][j]>numbers[i+1][j]){
                    return false;
                }
                if(numbers[i][j]>numbers[i][j+1]){
                    return false;
                }
            }
             
        }
        int m=numbers[0].length-1;//列
        int n=0; //行
        while(m>=0&&n<=numbers.length-1){
            if(numbers[n][m]>x){
                m--;
            }else if(numbers[n][m]<x){
                n++;
            }else{
                return true;
            }
        }
        return false;
    }

2.2每次都选择数组查找范围内的最左下角的数字

 public boolean Find(int x,int numbers[][]){
        if(numbers==null||numbers.length<=0){
            return false;
        }
        for(int i=0;i<numbers.length-1;i++){
            for(int j=0;j<numbers[i].length-1;j++){
                 if(numbers[i][j]>numbers[i+1][j]){
                    return false;
                }
                if(numbers[i][j]>numbers[i][j+1]){
                    return false;
                }
            }
             
        }
        int m=numbers.length-1;//行
        int n=0; //列
        while(m>=0&&n<=numbers[0].length-1){
            if(numbers[m][n]>x){
                m--;
            }else if(numbers[m][n]<x){
                n++;
            }else{
                return true;
            }
        }
        return false;
    }

猜你喜欢

转载自blog.csdn.net/u013244775/article/details/84947315
今日推荐