二维数组中的查找(java版)

来源:互联网 发布:云计算的一级产业链 编辑:程序博客网 时间:2024/05/16 19:24

1.问题描述

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

2.算法分析

二维数组特点:每一行都是递增有序,每一列都是递增有序。

根据二维数组的特点,查找一个待定元素target,首先与array[i][j]比较。结果分以下三种情况:

(1)target == array[i][j],返回true

(2)target  >  array[i][j]。此时,target在array[i][j]的右下部分区域

(3)target  <  array[i][j]。此时,target在array[i][j]的左上部分区域

        综上,由于行和列的方法都可变,查找的区域较大。那么,有没有一种方式可以减少待查元素变化的范围,将其按照行和列变化转化为只按照行变化或者只按照列变化。因此,可以采用降维的方式来处理该问题。


3.算法设计

首先,定义可用变量:

int[][] array  :  array数组,表示待查找集合

int colLength :列的长度

int rowLength:行的长度

int  row : 表示行下标,取值范围(0-array.length-1)。初值为array.length-1

int  col   :   表示列下标,取值范围(0-array[0].length-1)。初值为0

比较过程:target与array[row][col]比较。结果分为以下三种情况:

(1)target == array[row][col],返回true

(2)target  >  array[row][col]。此时,target在array[row][col+1]到array[row][colLength-1]之间

(3)target  <  array[row][col]。此时,查找上一行元素

此时,降维了。选取的待比较元素从行最大列最小开始,那么当target大于array[i][j]时,可以沿着列的方向继续比较。

4.代码实现

public boolean find(int[][] array, int target){int rowLength = array.length;int colLength = array[0].length;int row = rowLength -1;int i=0;while(row>=0 && i< colLength){if(array[row][i] > target){row--;}else if(array[row][i]<target){i++;}else {return true;}}return false;}

0 0
原创粉丝点击