劍指offer 面試題3(二維陣列中的查詢)

2021-08-14 23:01:20 字數 1683 閱讀 4963

題目:在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。

基本思路:

首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束;如果該數字大於要查詢的數字,剔除這個數字所在的列;如果該數字小於要查詢的數字,剔除這個數字所在的行。也就是說如果要查詢的數字不在陣列的右上角,則每一次都在陣列的查詢範圍中剔除一行或者一列,這樣每一步都可以縮小查詢的範圍,直到找到要查詢的數字,或者查詢範圍為空。

比較以下兩個版本:

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的方格,先找出右上角的數字,如果右上角的數字是我們要找的數字就結束,...