I、題し
左から右に二次元配列があり、アレイの各行がインクリメントされ、各列の上から下へ、この配列内の番号が存在するか否かを見つけるためにインクリメントされます。
要件:O(N)の時間計算量よりも少ないです。
第二に、アイデア
4. 6 1
2 5 7
3 6 9
アイデア:このような方法で、従来の二次元アレイの数は図面の全て一旦開始から終了までトラバースさ見つけるために、この場合の時間複雑度はO(N)であり、満たしていません話題の要件;
O(N)よりも少ないメイク複雑さ、彼らはないトラバース最初から最後まで、私たちは開始点を再選択することができないことを意味します。5つの選択肢の2次元アレイ見て開始する(このような時間
彼の方向よりも大きいか小さい、その後、開始する右コーナーを下げ、中央または左上隅から、中央、左上、右上、左下、右下のコーナーが、明らかにより多くの、多くの問題を通過。
トップの右と下をより便利に、左方向は彼よりも小さい、彼より大きいです。今回、我々は、開始位置と右上隅を選択しました。
第三に、コードの実装
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
int YangSquare(int a[][3], int x, int y,int z)
{
int i = 0; int j = 2;
while (i<x&&j>=0)
{
if (z > a[i][j])
{
i++;
}
else if (z < a[i][j])
{
j--;
}
else
{
return z;
}
}
return 0;
}
int main()
{
int z = 0;
int a[3][3] = { 1, 4, 6,
2, 5, 7,
3, 6, 9 };
printf("请输入你要查找的数:\n");
scanf("%d", &z);
printf("%d\n",YangSquare(a, 3, 3,z));
system("pause");
return 0;
}