该二维数组的特征是:
- a.每行中的整数从左到右按升序排列。
- b.每行的第一个整数大于前一行的最后一个整数。
可以每行都进行二分查找(由于该数组的特征,所以可以先将要查找的数与本行的最后一个数据比较,若大于则直接进入下一行比较,增加效率,减少比较的次数),如果未找到则进入下一层,直到找完该二维数组。
private static String find(int[][] arr, int num) { int row = 0; //控制行数 while (row < arr.length){ int left = 0; //行的左下标 int right = arr[row].length - 1; //行的右下标 while (left <= right) { //每一行进行二分查找 if(num > arr[row][right]){ //如果查找的数比该行的最后一个数还大,则直接进入下一行的比较 break; } //int mid = (left + right) / 2; int mid = (right - left + 1) / 2 + left; //防止相加超过数据类型的上界 if (arr[row][mid] == num) { return "[" + row + "," + mid + "]"; } else if (arr[row][mid] > num) { right = mid - 1; } else { left = mid + 1; } }//退出该层while循环说明该层未找到 ++row; //层数加一 }//退出说明未找到 return "无该整数";}
测试如下:
int[][] arr = {{1,3,5},{7,9},{15,19,20}};String index = find(arr,1);System.out.println(index);String index1 = find(arr,20);System.out.println(index1);String index2 = find(arr,9);System.out.println(index2);String index3 = find(arr,0);System.out.println(index3);
来源:https://www.cnblogs.com/128-cdy/p/12595893.html