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
相关文章推荐
- [置顶] 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发
- [java学习笔记]java语言基础概述之数组的定义&常见操作(遍历、排序、查找)&二维数组
- java 基础数据遍历(2)----二维数组查找
- 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发
- 遍历查找集合或者数组中的某个元素的值 java代码 详解 Android开发
- Java遍历Properties的所有的元素,四种方法详细总结的代码实例
- 二维数组的动态存储(遍历方阵,求各元素的和)
- Java中关于HashMap的元素遍历的顺序问题
- 剑指offerJava实现 二维数组的查找
- 在相邻元素相差1的数组中查找某一特定元素第一次出现的位置(非遍历)
- 二维数组中的查找(Java版)
- java--XML解析之根据id查找元素
- java中循环遍历删除List和Set集合中元素的方法
- Java中关于HashMap的元素遍历的顺序问题
- 2017/12/30Java基础学习——增强型for嵌套遍历在二维数组中的应用
- Java学习笔记30. 数组的使用(长度、遍历、最大最小值,查找)
- JAVA中LISt遍历时如何remove元素
- java 遍历map时删除元素
- [Java基础要义]HashMap、LinkedHashMap元素遍历机制探讨
- 二维数组中的查找(java版)