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;
        }
    }
    别废话,拿你代码给我看。
  • 相关阅读:
    根据索引删除数组内信息时导致程序崩溃
    C/C++判断字符串是否包含某个子字符串
    Qwidget布局操作之QGridLayout(网格布局)
    Qt获取文件路径、文件夹路径
    javascript DOM document属性
    javascript dom页面中的location属性
    javascript页面常用事件
    python的高阶函数式编程
    python set 集合复习--点滴
    python异常
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707497.html
Copyright © 2011-2022 走看看