java 二维数组 越界_剑指offer-二维数组的查找(Java 版)

一、题目

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

二、思路分析

该二维数组的特点:

二维数组右上角的数是该行最大值,该列最小值。

二维数组左下角的数是该行最小值,该列最大值。

所以我们可以从这两个方向入手。

1、从二维数组右上角的数入手

变量名的含义:

array:二维数组。

target:要寻找的目标值。

array [i] [j] 为二维数组中要和 target 比较的数,初始值为二维数组右上角的值。

思路分析:

二维数组数组合法性判断。

循环开始。(二维数组越界,循环停止)

当 target > array [i] [j],由于该行的其他数都比当前数大,说明要找的数不在这行,行下移。

当 target < array [i] [j],由于该列的其他数都比当前数小,说明要找的数不在这列,列左移。

当 target == array [i] [j],返回 true。

如果循环结束后还是没有返回值,说明当前二维数组没有满足我们要求的数,返回 false。

class Solution {

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

if(array == null || array.length <= 0 || array[0].length <= 0) {

return false;

}

int i = 0;

int j = array[0].length - 1;

while(i <= array.length -1 && j >= 0) {

if( target < array[i][j]) {

j--;

} else if( target > array[i][j]) {

i++;

} else {

return true;

}

}

return false;

}

}

2、从二维数组左下角的数入手

变量名的含义:

array:二维数组。

target:要寻找的目标值。

array [i] [j] 为二维数组中要和 target 比较的数,初始值为二维数组左下角的值。

思路分析:

二维数组数组合法性判断。

循环开始。(二维数组越界,循环停止)

当 target > array [i] [j],由于该列的其他数都比当前数小,说明要找的数不在这列,列上移。

当 target < array [i] [j],由于该行的其他数都比当前数大,说明要找的数不在这行,行右移。

当 target == array [i] [j],返回 true。

如果循环结束后还是没有返回值,说明当前二维数组没有满足我们要求的数,返回 false。

public class Solution {

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

if(array == null || array.length <= 0 || array[0].length <= 0) {

return false;

}

int i = array.length - 1;

int j = 0;

while (i >= 0 && j <= array[0].length - 1) {

if (target < array[i][j]) {

i--;

} else if (target > array[i][j]) {

j++;

} else {

return true;

}

}

return false;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值