您的位置:首页 > 编程语言 > Java开发

java二维数组遍历与元素查找

2018-03-06 22:00 501 查看

java二维数组

格式

数据类型 [ ][ ] arrayName = new 数据类型[一维数组的个数][每个一维数组的长度]

例如:

int [ ][ ] array = new int [2][3];
int [ ][ ] arr = {{2,3,4},{4,5,6}}


属性方法

二维数组的长度:arrayName.length - - -返回一维数组的个数

每个一维数组的长度:arrayName[数组下标].length

数组遍历

for (int i = 0; i < arr.length; i++){
for (int j = 0; j < arr[i].length; j++)
System.out.print(arr[i][j] + " ");
System.out.println();
}


输出结果:

2 3 4
4 5 6


按行倒置

初始数组遍历结果:

2 3 4
3 4 5
4 5 6
5 6 7


倒置后遍历结果:

5 6 7
4 5 6
3 4 5
2 3 4


实现上述效果的方法是首尾行交换,第二行与倒数第二行交换,以此类推…

for (int start = 0, end = arr.length - 1; start < end; start++, end--) {
int[] temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
}


元素查找

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

分析:这样的二维数组第一个元素最小,最后一个元素最大,因此如果这个整数不在二者组成的区间内,那么该整数必然不在数组内.因此数据的规则是左上角的数字一定小于其后面所有的数。可以采用二分法和分治法查找该整数在数组中行和列的位置.

二分法

问题的关键是将问题转化为一维.可以根据矩阵的第一列确定值可能所在的行的范围(limu,limd) ,其中limu=0,使得array[0][0] ≤ array[i][0] ≤ array[limd][0],i∈[0,limd]。而确定limd的值可以使用二分法。确定目标值可能所在行的范围后,逐行再进行二分查找目标值.此时问题转化为一维.

/*二分法查找目标元素*/
public boolean Find(int target, int[][] array) {
if (array.length == 0)
return false;
int i, j, mid, rows = array.length, cols = array[0].length;
if(target > array[rows - 1][cols - 1] || target < array[0][0])
return false;
int limd = rows - 1, limu = 0;
/*二分法查找目标值可能所在行的下限(查找的最大范围)*/
while (limu < limd) {
mid = (limu + limd) / 2;
if (array[mid][0] > target)
limd = mid - 1;
else if (array[mid][0] < target)
limu = mid + 1;
else
return true;
}
/*对每一行进行二分查找*/
for (i = 0; i <= limd; i++) {
int l = 0, r = cols - 1;
while (l <= r) {
mid = (l + r) / 2;
if (array[i][mid] < target)
l = mid + 1;
else if (array[i][mid] > target)
r = mid - 1;
else
return true;
}
}
return false;
}


分治法

另一种思路是采用分治法。二分法是先用第一列确定查找行的范围,分治法可以根据第一行去掉不用查找的列。假设查找的数组array结构如下所示:

2 3 5
3 4 8
5 7 9
7 10 13


如果查找数字4,那么第一行最后的元素是5,所以其所在的列不用查找。那么查找的二维数组范围是:

2 3
3 4
5 7
7 10


再判断数字3,因为4 > 3,所以4肯定不在这一行,数组继续缩减:

3 4
5 7
7 10


查找数字4,查找结束。

/*分治法查找目标元素*/
public boolean Find2(int target, int[][] array) {
if (array.length == 0)
return false;
int i, j, mid, rows = array.length, cols = array[0].length;
if (target > array[rows - 1][cols - 1] || target < array[0][0])
return false;
i = 0;
j = cols - 1;
while (i < rows && j >= 0) {
if (array[i][j] == target)
return true;
else if (array[i][j] > target)
j--;
else i++;
}
return false;
}


参考资料

二分法查找有序二维数组:

http://blog.csdn.net/jeanphorn/article/details/47028041
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息