題目:
在一個二維數組中,每一行都按照從左到右遞增排序,每一列都按照從上到下遞增排序輸入這樣一個二維數組和一個整數,判斷這個整數在不在這個二維數組中
如果在返回true,如果不在返回false
例如矩陣:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
這是一個4X4的矩陣,這個矩陣從上到下從左到右數據都是遞增的,如果在這個矩陣中查找7,則返回true,查找14返回false
最先看到這個題的時候,總是往在0(n)時間複雜度的前提下找數組的中位數的題目,如果使用那種思想的話,會把問題弄的很複雜而無從下手。分析完一步之後就不知道該怎麼繼續往下分析了。
我們不妨換一種思路去考慮這個問題,我們可以從矩陣的右上角或者是左下角開始和要查找的數字進行比較,每比較一次就可以排除一行或者一列。最後的情況也是行數加列數次比較,時間複雜度爲o(行數+列數)
實現代碼如下:
#include <iostream>
using namespace std;
/*劍指offer,面試題三
*在一個二維數組中,每一行都按照從左到右遞增排序,每一列都按照從上到下遞增排序
*輸入這樣一個二維數組和一個整數,判斷這個整數在不在這個二維數組中
*/
bool Find(int *matrix, int rows, int columns, int number )
{
bool found = false;
if(matrix!=NULL && rows>0 && columns>0)
{
int row = 0;
int column = columns-1;
while((row!=rows) && (column!=-1))
{
if(matrix[row*columns+column] == number)
{
found = true;
break;
}
else if(matrix[row*columns+column] > number)
{
--column;
}
else
{
++row;
}
}
}
return found;
}
// ==========================測試代碼==================
void Test(char* testName, int* matrix, int rows, int colunms, int number, bool expected)
{
if(testName != NULL)
{
cout<<testName<<" begind:";
}
bool result = Find(matrix,rows,colunms,number);
if(result == expected)
{
cout<<"Passed"<<endl;
}
else
{
cout<<"Failed"<<endl;
}
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數在數組中的情況
*/
void Test1()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test1", (int *)matrix, 4, 4, 7, true);
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數不在數組中的情況
*/
void Test2()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test2", (int *)matrix, 4, 4, 14, false);
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數是數組中的最小值
*/
void Test3()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test3", (int *)matrix, 4, 4, 1, true);
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數是數組中的最大值
*/
void Test4()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test4", (int *)matrix, 4, 4, 15, true);
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數比最小值還小
*/
void Test5()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test5", (int *)matrix, 4, 4, 0, false);
}
/* 1 2 8 9
* 2 4 9 12
* 4 7 10 13
* 6 8 11 15
* 要查找的數比最大值還大
*/
void Test6()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test("Test6", (int *)matrix, 4, 4, 20, false);
}
/*
* 輸入NULL
*/
void Test7()
{
Test("Test7", NULL, 4, 4, 7,false);
}
int main()
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
Test7();
return 0;
}
測試用例沒有想到作者給的這麼多,借鑑的作者的測試。以上代碼有幾點需要注意的地方
(1)首先就是講二維數組當做函數的參數傳遞應該怎麼傳遞
這裏是將二維數組轉化爲了一維數組進行操作
關於二維數組做函數參數的情況見下面的代碼:
#include <iostream>
using namespace std;
//測試二維數組當函數參數時的傳遞
void Test1(int *matrix)
{
cout<<"按照一維數組"<<matrix[10]<<endl;
}
void Test2(int matrix[][4])
{
cout<<"按照二維數組"<<matrix[2][2]<<endl;
}
int main()
{
int matrix[][4] = {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
Test1((int *)matrix);
Test2(matrix);
}
(2)這種測試的代碼是模仿作者寫的,感覺這種風格特別的好,以後要多多借鑑。