生活随笔
收集整理的這篇文章主要介紹了
[剑指offer]面试题3:二维数组中的查找
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
面試題3:二維數組中的查找
題目:在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。
解題思路:
首先選取數組中右上角的數字。如果該數字等于要查找的數字,查找過程結束;如果該數字大于要查找的數字,剔除這個數字所在的列;如果該數字小于要查找的數字,剔除這個數字所在的行。
代碼如下:
從矩陣的右上角開始找:
#include <iostream>
using namespace std
;
const int N
= 4;int a
[4][N
] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };bool Find(int(*p
)[N
], int rows
, int cols
, int num
)
{bool flag
= false;if (p
!= nullptr && rows
> 0 && cols
> 0){int row
= 0;int col
= cols
- 1;while (row
< rows
&& col
>= 0){if ((*(*(p
+ row
) + col
))==num
){flag
= true;break;}else if ((*(*(p
+ row
) + col
)) > num
) --col
;else ++row
;}}return flag
;
}int main()
{if (Find(a
, 4, 4, 13)) cout
<< "yes" << endl
;else cout
<< "no" << endl
;if (Find(a
, 4, 4, 14))cout
<< "yes" << endl
;else cout
<< "no" << endl
;return 0;
}
代碼如下:
從矩陣的左下角開始找:
#include <iostream>
using namespace std
;
const int N
= 4;int a
[4][N
] = { {1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15} };bool Find(int(*p
)[N
], int rows
, int cols
, int num
)
{bool flag
= false;if (p
!= nullptr && rows
> 0 && cols
> 0){int col
= 0;int row
= rows
- 1;while (row
>= 0 && col
< cols
){if ((*(*(p
+ row
) + col
)) == num
){flag
= true;break;}else if ((*(*(p
+ row
) + col
)) < num
) ++col
;else --row
;}}return flag
;
}int main()
{if (Find(a
, 4, 4, 13)) cout
<< "yes" << endl
;else cout
<< "no" << endl
;if (Find(a
, 4, 4, 14))cout
<< "yes" << endl
;else cout
<< "no" << endl
;return 0;
}
測試用例:
● 二維數組中包含查找的數字(查找的數字是數組中的最大值和最小值,查找的數字介于數組中的最大值和最小值之間)。
● 二維數組中沒有查找的數字(查找的數字大于數組中的最大值,查找的數字小于數組中的最小值,查找的數字在數組的最大值和最小值之間但數組中沒有這個數字)。
● 特殊輸入測試(輸入空指針)。
本題考點:
● 考查應聘者對二維數組的理解及編程能力。二維數組在內存中占據連續的空間。在內存中從上到下存儲各行元素,在同一行中按照從左到右的順序存儲。因此我們可以根據行號和列號計算出相對于數組首地址的偏移量,從而找到對應的元素。
● 考查應聘者分析問題的能力。當應聘者發現問題比較復雜時,能不能通過具體的例子找出其中的規律,是能否解決這個問題的關鍵所在。這個題目只要從一個具體的二維數組的右上角開始分析,就能找到查找的規律,從而找到解決問題的突破口。
總結
以上是生活随笔為你收集整理的[剑指offer]面试题3:二维数组中的查找的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。