剑指 Offer 04. 二维数组中的查找

题目描述:

在一个 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

 

 

一直显示超时,不知道为啥

 1 class Solution {
 2     public int findNUmberInArray(int[] array,int target,int lo,int hi){
 3         hi=array.length;
 4         int mid;
 5         while(lo<hi){
 6             mid=(lo+hi)>>2;
 7             if(target<mid)
 8                 hi=mid;
 9             else
10                 lo=mid+1;
11         }
12         
13           return lo-1;
14         
15 
16 
17     }
18     public boolean findNumberIn2DArray(int[][] matrix, int target) {
19     int lo=0,hi=matrix[0].length;
20      for(int i=0;i<matrix.length;i++){
21         int m=findNUmberInArray(matrix[i],target,lo,hi);
22         if(m<0)
23            return false;
24         else if(matrix[i][m]==target)
25            return true;
26         else
27            lo=m;   
28      }
29 
30 
31     return false;
32     }
33     }
View Code

我知道了,问题出在mid=(lo+hi)>>2;应该是右移一位。

被折叠的代码有很多问题,在idea上改了改去才发现,包括target和mid比较这种错误。

修改后的代码如下,获得了满分。我又想复杂了,其实比起暴力破解改善不是很明显,还不如直接暴力搜索来的简单。

 1 class Solution {
 2     private static int findNUmberInArray(int[] array,int target,int lo,int hi){
 3             int mid;
 4             while(lo<hi){
 5                 mid=(lo+hi)>>1;
 6                 if(target<array[mid])
 7                     hi=mid;
 8                 else
 9                     lo=mid+1;
10             }
11             return lo-1;
12         }      
13     
14     public boolean findNumberIn2DArray(int[][] matrix, int target) {
15          if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
16             return false;
17         }
18     int lo=0,hi=matrix[0].length;
19     for(int i=0;i<matrix.length;i++){
20          int m=findNUmberInArray(matrix[i],target,lo,hi);
21          if(m<0)
22             continue;
23          if(matrix[i][m]==target)   
24                    return true;     
25          
26            }  
27     return false;
28      }
29 
30     
31     
32     }

有几个问题待解决:

1数组在java中是什么,为什么可以有数组名.length这种操作?

2数组在java和c++中是有区别的,c++中可以有数组a=数组b这种操作吗?java中这样表示两个数组指向同一个。数组名是否等于null怎么理解?

3为什么在leetcode中的自定义函数要设置成private?

 

posted @ 2021-03-03 19:45  wsshub  阅读(37)  评论(0)    收藏  举报