zoukankan      html  css  js  c++  java
  • 牛客剑指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;
        }
    }
    别废话,拿你代码给我看。
  • 相关阅读:
    <input type='date'>传到后台怎么接收
    @Conditionnal注解和拦截器
    docker安装nginx
    vue npm run build报错 npm ERR! missing script: build
    阳哥讲面试题(七)Redis五种基本类型,分布式锁
    阳哥讲面试题(六)AOP,循环依赖
    mysql建表报错(this is incompatible with sql_mode=only_full_group_by)
    阳哥讲面试题(五)各种锁,LockSupport,AQS
    SSM_CRUD新手练习(2)配置文件
    Mysql逻辑分层、存储引擎
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707497.html
Copyright © 2011-2022 走看看