二维数组中的查找

 

 

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

示例:

现有矩阵 matrix 如下:

[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30] ]

给定 target = 5,返回 true。

给定 target = 20,返回 false。

 

限制:

0 <= n <= 1000

0 <= m <= 1000

 

题解:

从右上角开始走,利用这个顺序关系可以在O(m+n)的复杂度下解决这个题:

  • 如果当前位置元素比target小,则row++
  • 如果当前位置元素比target大,则col--
  • 如果相等,返回true
  • 如果越界了还没找到,说明不存在,返回false
1 public class Problem04 { 2 public static void main(String[] args) { 3 4 int array[][] = {{1, 4, 7, 11, 15}, 5 {2, 5, 8, 12, 19}, 6 {3, 6, 9, 16, 22}, 7 {10, 13, 14, 17, 24}, 8 {18, 21, 23, 26, 30}}; 9 /*System.out.println(array.length); 10 System.out.println(array[0].length);*/ 11 12 13 System.out.println(find3(array,1)); 14 15 16 } 17 18 public static boolean find1(int arr[][], int number) { 19 //直接暴力遍历,但是没有使用题目的递增条件,时间0(m*n) 20 int row=arr.length; 21 for (int i = 0; i < row; i++) { 22 for (int j = 0; j < arr[i].length; j++) { 23 if(arr[i][j]==number) 24 return true; 25 } 26 } 27 return false; 28 } 29 30 public static boolean find2(int arr[][], int number) { 31 //将右上角看作二叉搜索树,时间0(m+n),注意数组为null或者数组为空的情况 32 if (arr == null || arr.length == 0) 33 return false; 34 35 int rows = 0; 36 int line = arr[0].length - 1; 37 while (arr[rows][line] != number) { 38 39 if (number > arr[rows][line]) { 40 rows++; 41 if (rows == arr.length - 1) 42 return false; 43 }else{ 44 line--; 45 if (line < 0) 46 return false; 47 } 48 } 49 return true; 50 } 51 public static boolean find3(int arr[][], int number) { 52 //将右上角看作二叉搜索树,时间0(m+n),注意数组为null或者数组为空的情况 53 int rows = 0; 54 int line = arr[0].length - 1; 55 56 if (arr == null || arr.length == 0||arr[0].length==0) 57 return false; 58 59 while (rows<arr.length&&line>=0) {//此处是且 60 61 if (number > arr[rows][line]) { 62 rows++; 63 }else if(number<arr[rows][line]){ 64 line--; 65 }else{ 66 return true; 67 } 68 } 69 return false; 70 71 } 72 73 }

 


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof


__EOF__

本文作者程序员小宇
本文链接https://www.cnblogs.com/treasury/p/12594257.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   程序员小宇  阅读(138)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示