二维数组中的查找问题--剑指offer面试题3
题目:在一个二维数组中,对每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
// 二维数组中的查找 #include <iostream> using namespace std; int SearchMatrix(int *arr, int key, int row, int col) { if (arr == NULL) return 0; int row_index,col_index,pivotkey; int y = sizeof(arr)/sizeof(int); // for test cout << y <<endl; // y = 1 row_index = 0; col_index = col - 1; while (row_index <= row - 1 && col_index >= 0) { pivotkey = *(arr + row_index * col + col_index); if (pivotkey == key) return 1; else if (pivotkey > key) { col_index --; } else { row_index ++; } } return 0; } int main() { int res, row = 0, col = 0; int arr[4][4] = {{1, 2, 8, 9},{2, 4, 9, 12}, {4, 7, 10, 13}, {6, 8, 11, 15}}; int y = sizeof(arr)/sizeof(int); cout << y << endl; // 输出为16 row = (sizeof(arr)/sizeof(int)) / (sizeof(arr[0]) / sizeof(int)); col = sizeof(arr[0])/sizeof(int); res = SearchMatrix((int *)arr, 120, row, col); if (res == 1) cout << "found it" <<endl; else cout << "not found it" <<endl; return 0; }
在写的时候发现一个问题,就是二维数组作为参数传入函数时,会有多种方法
第一种方式是直接传递二维数组,但是必须标明第二维的值,因为如果只是传递a[][],编译器无法分配这样的数组,所以要这样传int a[][4]
第二种方法是传递指针数组方式,即int (*a)[4] , 这句话声明了一个指针变量(即数组指针),这个指针指向由4个int组成的数组 ,是一个一级指针
第三种是传递指针方法,即上边程序的方法。
不管是哪一种方法,在写程序的实参时,都要注意要匹配,有时候要进行一些强制类型的转换。
比如:
int a[3][4];
可以理解为a数组是三个元素组成的一维数组,这三个数组的名字分别为a[0], a[1], a[2],其中的每个元素又是由四个元素组成的一维数组。
a是三个一维数组a[0], a[1], a[2]的首地址
而a[0], a[1], a[2]又是三个数组名,分别表示三个一维数组的首地址。