在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
输入可能包含多个测试样例,对于每个测试案例,
输入的第一行为两个整数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// // main.c // 二维数组中的查找 // // Created by 李亚坤 on 14-9-27. // Copyright (c) 2014年 李亚坤. All rights reserved. // #include <stdio.h> #include <stdlib.h> #define MAX 1000000 int find(int m, int n, int target,int a[]) { // 二分搞起了 int middle, left, right; left = 0; right = m * n; while (left < right) { middle = (left + right - 1) / 2; if (target > a[middle]) { left = middle + 1; } else if (target < a[middle]) { right = middle; } else return 0; } return -1; } int main(int argc, const char * argv[]) { int a[MAX]; int m, n; int i, j; int target; scanf("%d %d", &m, &n); scanf("%d", &target); for (i = 0; i < m; i++) { for (j = 0; j < n; j++) { scanf("%d", &a[i * m + j]); } } if (find(m, n, target, a) == 0) printf("Yes "); else printf("No "); return 0; }