• 牛客网&剑指offer 二维数组中的查找(JAVA)


    牛客网·剑指offer 二维数组中的查找(JAVA)

    题目描述

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

    解题思路

    解法一

    将每一行看成一个一维数组,手写二分排序查他。

    public class Solution {
        private static int BS(int fromIndex, int toIndex, int[] a, int num) {
            int low = fromIndex, high = toIndex-1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if(a[mid] < num) 
                    low = mid + 1;
                else if(a[mid] > num)
                    high = mid - 1;
                else 
                    return mid;
            }
            return -(low + 1);
        }
        public boolean Find(int target, int [][] array) {
            if(array == null) return false;
            boolean ans = false;
            for(int i = 0; i < array.length; i++) {
                if(array[i].length == 0 || array[i][0] > target) break; //万一此列为空
                if(BS(0, array[i].length, array[i], target) < 0) continue;
                else {
                    ans = true;
                    break;
                }
            }
            return ans;
        }
    }
    

    解法二

    前提:矩阵是有序的。

    从第i行看:

    • 若该行的最后一个数字小于所查询数字, 那么肯定不可能在该行,直接去下一行查找。
    • 若该行的最后一个数字等于所查询数字,那么返回true。
    • 若该行的最后一个数字大于所查询数字,那么必在该行,搜索即可。
    public class Solution {
        public boolean Find(int [][] array,int target) {
            boolean found = false;
            int lie = array[0].length; // 列长
            int hang = array.length;   // 行数
            int column = lie -1;	   // 从最后一列看起
            int row =0;				   // 从第一行看起
            while(row<hang &&column>=0){
               int value = array[row][column];
                if(target>value){
                    row++;
                }else if(value>target){
                    column--;
                }else{
                    found = true;
                    break;
                }
            }
                return found;
    	}
    }
    

    解法3

    解法二中引入快排

    public class Solution {
        private static int BS(int fromIndex, int toIndex, int[] a, int num) {
            int low = fromIndex, high = toIndex-1;
            while(low <= high) {
                int mid = (low + high) / 2;
                if(a[mid] < num)
                    low = mid + 1;
                else if(a[mid] > num)
                    high = mid - 1;
                else
                    return mid;
            }
            return -(low + 1);
        }
        public boolean Find(int target, int [][] array) {
            boolean ans = false;
            for(int i = 0; i < array.length; i++) {
                if(array[i].length == 0) break;
                int value = array[i][array[i].length-1];
                if(value < target)
                    continue;
                else if (value > target) {
                    if(BS(0, array[i].length, array[i], target) >= 0)
                        ans = true;
                } else {
                    ans = true;
                    break;
                }
            }
            return ans;
        }
    }
    
  • 相关阅读:
    XGBoost,GBDT原理详解,与lightgbm比较
    开机或联网时自启动gunicorn
    mac下查看jdk安装版本及安装目录
    Linux常用操作
    ssh远程登录出现Host key verification failed.解决办法
    gunicorn运行显示connection in use解决办法
    nginx,gunicorn常用命令
    Git入门--创建版本库,关联远程库,从远程库下载
    【新手向】阿里云上ubuntu+flask+gunicorn+nginx服务器部署(二)项目部署
    系统护肤+身体
  • 原文地址:https://www.cnblogs.com/fromneptune/p/12346162.html
Copyright © 2020-2023  润新知