二维数组打乱顺序 java_Java编程题:二维数组中的查找【题目来自牛客网】

题目描述

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

话不多说,先上代码,解析在下面:

public class Solution {

public boolean Find(int target, int [][] array) {

int row=array.length;

int col=array[0].length;

int left=0;

int right=col-1;

while(left=0){

if(target==array[left][right])

return true;

else if(array[left][right]target)

right--;

}

return false;

}

}

①一开始没仔细审题,以为是要自己录入一个二维数组的值,就是说,通过Scanner录入(一开始傻傻的写了半天),然后再仔细一看题,boolean类型的,而且已经有了参数,target和array这两个题目中的信息……这里是我浪费了n多时间的地方。长个教训……

②二维数组获取行数和列数,一开始写成了.length()……然后才想起来length不用(),直接获取到的,又一次天真。。

③解题思路:因为是二维数组,其实可以从四个角上的数据开始进行思考,比如说你把二维数组看成一个长方体,那么长方体的四个直角所在的四个数据,都可以开始计算。

但是考虑到从小向大【左上角开始】,以及从大到大【右上角开始】,很容易造成一个尴尬的局面,比如下面这个二维矩阵:

1 2 3

2 4 5

3 6 8

1)从左上角开始的话,如果target是5,而你第一次判断的时候,不管是横向,还是纵向,都会发现小于target,那么这个时候到底应该横向++还是纵向++?第三列或者第三行,3还是小于target,这个时候就会跳出while,导致检测不到数据,返回false,然而数组里确实有这个数据,所以不推荐从左上角开始写算法。

2)那么右下角呢?同样是上面这个二维矩阵,如果target=2,就会导致和上面说到的一样的情况。

左上角:既是行最小,又是列最小。

右下角:既是行最大,又是列最大。

正因为如此,左上角和右下角是不可行的。

那么左下角呢?他一定是同列里最大的,同行里最小的,这与右上角有着类似的情况,所以这个是可以的。

④再确认了可以从右上角和左下角开始运算以后,我们就需要定量,比如left和right的值,还有数组元素与target比较后,哪个++,哪个- -,这就是比较简单的问题了。

⑤总结:这个题其实不难,难就难在是否有一颗戒骄戒躁的心,以及认真思考的头脑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值