題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
基本思路:
首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束;如果該數字大於要查詢的數字,剔除這個數字所在的列;如果該數字小於要查詢的數字,剔除這個數字所在的行。也就是說如果要查詢的數字不在陣列的右上角,則每一次都在陣列的查詢範圍中剔除一行或者一列,這樣每一步都可以縮小查詢的範圍,直到找到要查詢的數字,或者查詢範圍為空。
比較以下兩個版本:
for迴圈:
#include
bool find(int a[4], int n)
if (n < a[row][col])
col--;
if (n > a[row][col])
row++;}}
//if ((row > 3) || (col < 0))
return
false;
}int main()
,,,};
printf("請輸入要查詢的數:\n");
int n;
scanf("%d", &n);
if (find(a, n) == true)
printf("true\n");
else
printf("false\n");
return
0;}
while迴圈:
#include
bool find(int a[4], int n)
else
if (a[row][col] > n)
else
}}int main()
,,,};
printf("請輸入要查詢的數:\n");
int n;
scanf("%d", &n);
if (find(a, n) == true)
printf("yes\n");
else
printf("no\n");
return
0;}
在for迴圈程式測試中發現如果輸入的數比陣列中最小的數還小, 那麼結果不是no,而是程式跳不出迴圈一直卡著,而使用while迴圈則沒有這樣的問題。
那麼,要怎麼改進使for迴圈能正常呢?
#include
bool find(int a[4], int n)
if (n < a[row][col])
col--;
if (n > a[row][col])
row++;
}if (col < 0) //注意這裡,如果一直沒有找到比自己小的數,要跳出迴圈
}return
false;
}int main()
,,,};
printf("請輸入要查詢的數:\n");
int n;
scanf("%d", &n);
if (find(a, n) == true)
printf("yes\n");
else
printf("no\n");
return
0;}
劍指offer 面試題3 二維陣列的查詢
題目 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution else if array row col target col else row return ...
劍指offer面試題3 二維陣列查詢問題
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。暴力破解方式也就是對二維陣列中的每個元素逐個檢查,結束條件為找到和目標值相等的元素或者查詢到最後乙個元素。對於乙個行列數都為n的二維陣...
劍指offer面試題 二維陣列的查詢
思路 當我們看到這道題的第一反應應該是遍歷這個二維陣列,逐個進行查詢,這樣雖然可以得到結果但是時間複雜度較大,並且沒有用到題目中給我們的線索,我們可以看到該二維數字是按照一定順序排列的。我們可以把這個四行四列的二維陣列看做乙個4 4的方格,先找出右上角的數字,如果右上角的數字是我們要找的數字就結束,...