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.youkuaiyun.com/jeanphorn/article/details/47028041
本文介绍了Java中二维数组的定义与遍历,并探讨了如何在一个有序二维数组中进行元素查找。通过首尾行交换实现数组的倒置,以及利用二分法和分治法来高效定位目标元素。
304

被折叠的 条评论
为什么被折叠?



