【劍指offer】二分查詢二維陣列
轉載請註明出處:http://blog.csdn.net/ns_code/article/details/24977113
劍指offer上的第三道題目,在九度OJ上測試通過
- 題目描述:
在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
- 輸入:
輸入可能包含多個測試樣例,對於每個測試案例,
輸入的第一行為兩個整數m和n(1<=m,n<=1000):代表將要輸入的矩陣的行數和列數。
輸入的第二行包括一個整數t(1<=t<=1000000):代表要查詢的數字。
接下來的m行,每行有n個數,代表題目所給出的m行n列的矩陣(矩陣如題目描述所示,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
- 輸出:
對應每個測試案例,
輸出”Yes”代表在二維陣列中找到了數字t。
輸出”No”代表在二維陣列中沒有找到數字t。
- 樣例輸入:
3 3
5
1 2 3
4 5 6
7 8 9
3 3
1
2 3 4
5 6 7
8 9 10
3 3
12
2 3 4
5 6 7
8 9 10
- 樣例輸出:
Yes
No
No
時間限制:1 秒
記憶體限制:32 兆
採用二分查詢法,時間複雜度為O(max(m,n))。先將給定的值key與二維陣列右上角的元素比較,若相等,則返回true,若key小於它,則最後一列的元素肯定都大於key,此時可以刪除掉最後一列,而若key大於它,則第一行的元素肯定都小於key,此時可以刪除掉第一行,依次向下比較,如果比較到了左下角的元素,還沒有發現等於key的,則返回fasle。
實現程式碼如下:
#include<stdio.h>
#include<stdbool.h>
/*
在m*n的升序二維陣列matrix中查詢是否有key
*/
bool Find(int *matrix,int m,int n,int key)
{
if(matrix==NULL || m<1 || n<1)
return false;
int row = 0;
int col = n-1;
while(row<=m-1 && col>=0)
{
if(matrix[row*n+col] == key)
return true;
else if(matrix[row*n+col] > key)
col--;
else
row++;
}
return false;
}
int main()
{
int m,n;
while(scanf("%d %d",&m,&n) != EOF)
{
int key,i;
//不加static會產生棧記憶體溢位,
//如果不加static,matrix陣列的記憶體在棧內分配,
//如果加static,matrix陣列的記憶體分配在全域性已初始化區。
//另外,此處用最大範圍的陣列,會增大所用記憶體,
//但如果用malloc動態分配,則會增加執行時間。
static int matrix[1000*1000] = {0};
scanf("%d",&key);
for(i=0;i<m*n;i++)
scanf("%d",matrix+i);
bool result = Find(matrix,m,n,key);
if(result)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
/**************************************************************
Problem: 1384
User: mmc_maodun
Language: C
Result: Accepted
Time:680 ms
Memory:4820 kb
****************************************************************/
相關文章
- 【劍指offer】二維陣列中的查詢陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 【劍指offer】 第三題 二維陣列查詢陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- 劍指Offer積累-JZ1-二維陣列中的查詢陣列
- 劍指offer刷題記錄_2. 二維陣列中的查詢陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 劍指 offer(1) -- 陣列篇陣列
- offer通過--3二維陣列中查詢-2陣列
- 二維陣列查詢陣列
- JavaScript --二維陣列查詢一維陣列JavaScript陣列
- 【Java】陣列二分查詢元素Java陣列
- 劍指offer之順序列印陣列陣列
- 【劍指offer】陣列中的逆序對陣列
- 【劍指offer】調整陣列順序陣列
- 二維陣列中的查詢陣列
- 劍指Offer-37-陣列中逆序對陣列
- 《劍指offer》:[52]構建乘積陣列陣列
- 【劍指offer】把陣列排成最小的數陣列
- 每日一題 - 劍指 Offer 53 - I. 在排序陣列中查詢數字 I每日一題排序陣列
- 0二分查詢簡單 牛客NC.71旋轉陣列的最小數字 leetcode劍指 Offer 11. 旋轉陣列的最小數字陣列LeetCode
- 【JZOF】二維陣列中的查詢陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 【劍指offer】連續子陣列的最大和陣列
- 【劍指offer】旋轉陣列的最小值陣列
- php陣列中二分查詢是什麼PHP陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 《劍指offer》:[51]陣列中的重複數字陣列
- 九度 二維陣列中的查詢陣列