问题:有一个二维数组.数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。
数组:
1 2 3
2 3 4
3 4 5
1 3 4
2 4 5
4 5 6
解题思路:杨氏矩阵有四个特殊点:左上(行列最小),左下(行小列大),右上(行大列小),右下(行列都大),只要在这四个点开始找一次就会排除一行或者一列。
下面就以右上角为例:
#include<stdio.h> #include<Windows.h> #include<assert.h> #define COL 3 int is_find(int a[][COL], int size, int input) { assert(a); assert(size > 0); int i = 0; int j = COL-1; while (i < size&&j >= 0){ if (a[i][j]>input) j--; //每次移动一列 else if (a[i][j] < input) i++; //每次移动一行 else return 1; } return 0; } int main(){ int a[][COL] = { {1,2,3}, {4,5,6}, {7,9,10}, }; int size = sizeof(a) / sizeof(a[0]); int input = 7; int b=is_find(a,size,input ); if (b == 1) printf("已找到!"); else printf("这个数不存在!"); system("pause"); return 0; }