题目链接:http://ac.jobdu.com/problem.php?cid=1039&pid=0
题目描述:
题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 输入: 输入可能包含多个测试样例,对于每个测试案例, 输入的第一行为两个整数m和n(1<=m,n<=1000):代表将要输入的矩阵的行数和列数。 输入的第二行包括一个整数t(1<=t<=1000000):代表要查找的数字。 接下来的m行,每行有n个数,代表题目所给出的m行n列的矩阵(矩阵如题目描述所示,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 输出: 对应每个测试案例, 输出”Yes”代表在二维数组中找到了数字t。 输出”No”代表在二维数组中没有找到数字t。 样例输入: 3 3 5 1 2 3 4 5 6 7 8 9 3 3 1 2 3 4 5 6 7 8 9 10 3 3 12 2 3 4 5 6 7 8 9 10 样例输出: Yes No No
Java代码,测试通过,但是OJ测试Runtime Error
import java.util.Scanner; /** * 题目一:二维数组中的查找 * Runtime Error * @author yinger */ public class NineOj_t1 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int m, n, key;// m行 n列 key要查找的数字 while (scanner.hasNext()) { m = scanner.nextInt(); n = scanner.nextInt(); key = scanner.nextInt(); int[][] data = new int[m][n]; for (int i = 0; i < m; i++) {// 给数组赋值 for (int j = 0; j < n; j++) { data[i][j] = scanner.nextInt(); } } search(data, m, n, key); } } // 从二维数组data[m][n]中找key private static void search(int[][] data, int m, int n, int key) { int[] line = new int[n]; for (int i = 0; i < n; i++) {// 一维数组line保存data的对角线 line[i] = data[i][i]; } boolean flag = false;// 标识是否找到 int low = 0, high = n - 1, mid; while (low <= high) {// 折半查找 mid = (low + high) / 2; if (line[mid] == key) { flag = true; break; } else if (line[mid] > key) { high = mid - 1; } else { low = mid + 1; } } // line[low] data[low][low-1] data[low-1][low] if (!flag && low - 1 >= 0) { if ((low < m && data[low][low - 1] == key) || (low < n && data[low - 1][low] == key)) { flag = true; } } if (flag) { System.out.println("Yes"); } else { System.out.println("No"); } } }