剑指offer第二版面试题4:二维数组中的查找(java)

面试题4:二维数组中的查找

题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否函数该整数。

当然最简单的两层循环是可以实现的,但是这样没有意义,我的第一个反应就是双层循环的稍微优化一点点。

  • main函数

     public static void main(String[] args) {
            int[][] arr = {{1, 2, 8, 9},
                    {2, 4, 9, 12},
                    {4, 7, 10, 13},
                    {6, 8, 11, 15}};
            System.out.println(findnumber(arr,14));;
        }
    
  • 手写

 public static boolean findnumber(int[][] arr,int number){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if(arr[i][j]==number){
                    return true;
                }else {
                    if (arr[i][j]>number){
                        break;
                    }
                }
            }
        }
        return false;
    }

就是从左上方开始,如果发现下一个元素比number大,那么直接进入下一行去比较。

缺点:O2的时间复杂度

  • 答案

    从右上角或者左下角开始进行查找,只要比最右侧列的第一个元素小,则最右侧一整列的元素都可舍弃,进行下一次循环,如果比最右侧列的第一个元素大,则舍弃掉这一行,以此类推,直到找到该元素。

public static boolean findnumber(int[][] arr,int number){
        int rows = 0; //行数
        int coloumns = arr[0].length-1; //列数
        while (rows<arr.length && coloumns>=0){
            if(arr[rows][coloumns]==number){
                return true;
            }else if(arr[rows][coloumns]>number){
                coloumns--;
            }else if(arr[rows][coloumns]<number){
                rows++;
            }
        }
        return false;
    }

分析:本题的关键就在于,发现右上角这一个特殊的点,左上是比自己小的,右下是比自己大的。那么只要找到角即可解决问题。

posted @   杀戒之声  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
点击右上角即可分享
微信分享提示