剣指Offer-9度1384-2 D配列の検索
7372 ワード
Offer-9 1384-2 D の
2013-11-23 23:23
タイトルの説明:
2 D配列では、各行が左から右に増加し、各列が上から下に増加した順にソートされます.関数を完了し、このような2次元配列と整数を入力して、配列にその整数が含まれているかどうかを判断してください.
入力:
入力には、各テストケースについて、複数のテストケースが含まれる場合があります.
入力される第1の動作の2つの整数mおよびn(1<=m,n<=1000):入力するマトリクスの行数および列数を表す.
入力された2行目には、検索する数値を表す整数t(1<=t<=1000000)が含まれます.
次のm行は、各行にn個の数があり、問題が与えるm行n列を表す行列(行列は、問題記述に示すように、各行が左から右に増加する順序で並べ替えられ、各列が上から下に増加する順序で並べ替えられる.
出力:
各テストケースに対応し、
出力「Yes」は、2次元配列で数値tが見つかったことを表します.
出力「No」は、2次元配列に数字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
:
。 、 , ,a[i][j] = a[i * col + j],row ,col 。
, 。 O(log(m * n)), O(1)。
1 // 650233 zhuli19901106 1384 Accepted case 4968KB 813B 690MS
2 // 201311121726
3 #include <cstdio>
4 using namespace std;
5
6 const int MAXN = 1005;
7 int a[MAXN][MAXN];
8 int x, y;
9
10 int main()
11 {
12 int i, j;
13 int left, right, mid;
14 int target;
15
16 while(scanf("%d%d", &x, &y) == 2){
17 scanf("%d", &target);
18 for(i = 0; i < x; ++i){
19 for(j = 0; j < y; ++j){
20 scanf("%d", &a[i][j]);
21 }
22 }
23 if(x * y <= 0){
24 printf("No
");
25 continue;
26 }
27 left = 0;
28 right = x * y - 1;
29 while(left <= right){
30 mid = (left + right) / 2;
31 i = mid / y;
32 j = mid % y;
33 if(target < a[i][j]){
34 right = mid - 1;
35 }else if(target > a[i][j]){
36 left = mid + 1;
37 }else{
38 break;
39 }
40 }
41
42 printf((left <= right) ? "Yes
" : "No
");
43 }
44
45 return 0;
46 }