題目:
楊氏矩陣(一個二維數組,數組的每行從左到右是遞增的,每列從上到下是遞增的)
在這樣的數組中查找一個數字是否存在。
要求時間複雜度小於O(N);數組
主要思路:
題目要求時間複雜度度不能大於O(N),因此判斷次數必須小於遍歷一次數組次數。
因此從數組的右上角開始判斷,若當前元素大於要查找的數字,則跳過當前列查詢下一列,若當前元素小於要查找的數,則跳過當前行查找下一行,直至找到或者找不到。ide
eg:
此處使用數組arr[3][3]={1,2,3,4,5,6,7,8,9};
1 2 3
4 5 6
7 8 9
在數組中朝查找5,首先判斷3<5,則查找範圍就變成了
4 5 6
7 8 9
再判斷6>5,則查找範圍又變爲了
4 5
7 8
這時候再判斷5=5
則找到code
源代碼:it
#include<stdio.h> #include<stdlib.h> void find(int arr[][3],int *row, int *col,int key) { int x = 0; int y = *col - 1; while (x <*row&&y>0)//判斷條件 { if (arr[x][y] == key)//找到 { *row = x; *col = y; return; } else if (arr[x][y] < key) { x++;//變換行 } else { y--;//變換列 } } *row = -1; *col = -1; } int main() { int arr[3][3]= {1,2,3,4,5,6,7,8,9}; int x=3; int y=3; int *row = &x; int *col = &y; int key=5; find(arr,row,col,key); if (*row == -1 && *col == -1) { printf("沒找到\n"); } else { printf("找到了,下標爲%d %d\n", *row, *col); } system("pause"); return 0; }