牛客剑指Offer1

题目描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
题解:
一、暴力法
分析: 就是不断去遍历数组的每个元素。
代码如下:

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;
    }
}

二、从左下找
分析:
利用该二维数组的性质:

  • 每一行都按照从左到右递增的顺序排序,
  • 每一列都按照从上到下递增的顺序排序

改变个说法,即对于左下角的值 m,m 是该行最小的数,是该列最大的数每次将 m 和目标值 target 比较:

  • 当 m < target,由于 m 已经是该行最大的元素,想要更大只有从列考虑,取值右移一位
  • 当 m > target,由于 m 已经是该列最小的元素,想要更小只有从行考虑,取值上移一位
  • 当 m = target,找到该值,返回 true 用某行最小或某列最大与 target 比较,每次可剔除一整行或一整列

代码如下:

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;    
 }}

三、二分法
分析: 把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是nlogn
代码如下:

public class Solution {
    public boolean Find(int target, int [][] array) {
        for(int i = 0; i < array.length; i++){
            int low = 0;
            int high = array[0].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;
    }
}
posted @ 2020-02-12 19:41  阳神  阅读(124)  评论(0编辑  收藏  举报