题目来自剑指offer,如下图所示。
下图是解法。
1 package com.jeaven; 2 import java.util.Scanner; 3 4 /*在二维数组中查找数字*/ 5 public class Problem4 { 6 public static void main(String[] args) { 7 int num = 0; //待查找的数字 8 int row = 0; //数组行数 9 int col = 0; //数组列数 10 Scanner reader = new Scanner(System.in); 11 System.out.println("请输入数组的行数:"); 12 if(reader.hasNextInt()) { 13 row = reader.nextInt(); 14 } 15 System.out.println("请输入数组的列数:"); 16 if(reader.hasNextInt()) { 17 col = reader.nextInt(); 18 } 19 int[][] arr = new int[row][col]; //初始化数组 20 for(int i = 0; i < row; i++) { 21 22 System.out.println("请输入第 " + (i+1) + " 行的数"); 23 for(int j = 0; j < col; j++) { 24 if(reader.hasNextInt()) { 25 arr[i][j] = reader.nextInt(); 26 } 27 } 28 } 29 System.out.println("请输入需要查找的数字: "); 30 if(reader.hasNextInt()) { //输入一个等待查找的数字 31 num = reader.nextInt(); 32 } 33 new Problem4_Solution1().solve(arr, num); 34 } 35 } 36 37 38 /*解法:从数组的左下角或者右上角开始查找,下面从左下角开始查找 39 *依次缩小搜索范围,小于当前的数则减少下面一行,大于则减少左边一列 40 *注意:如果数组中有重复数字,那从左下角开始查找,只能查找距离左下角元素最近的那个数字。 41 */ 42 class Problem4_Solution1 { 43 public boolean solve(int[][] arr, int num) { 44 int row = arr.length; //获得二维数组的行数 45 int col = arr[0].length; //获得二维数组的列数 46 int find_row = row - 1; 47 int find_col = 0; 48 while((find_row >= 0) && (find_col <= col-1)) { 49 if(arr[find_row][find_col] == num) { 50 System.out.println("find it successfully..."); 51 System.out.println("查找数字是数组的第 " + (find_row+1) + " 行,第 "+ (find_col+1) +" 列"); 52 return true; 53 } else if(arr[find_row][find_col] > num){ 54 find_row -= 1; 55 } else { 56 find_col += 1; 57 } 58 } 59 60 return false; 61 } 62 }
下面这个是结果图。从问题图中那个4x4的二维矩阵中查找出数字7。