例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果在這個陣列中查詢數字7,則返回true;如果查詢數字5,則返回false;
可以從乙個具體的例子開始,尋找普遍的規律。注意到右上角的數字9是所在行的最大數字,所在列的最小數字。假設要查詢的數字是7,那麼與9相比要小,當然也就小於9所在列的其他數字,查詢範圍可以進行縮小(紅色數字表示被排除的區域)。
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
進一步地,取8和7進行比較,8還是大於7,同樣地,排除8所在的這一行。
1 2 89
2 4 912
4 7 1013
6 8 1115
再取2與7進行比較,2小於7,那麼2所在的那一行(這裡指的是剩下的1和2)都會小於7,排除2所在的這一行。
1 289
2 4 912
4 7 1013
6 8 1115
取4與7進行比較,4小於7,刪掉4所在的那一行。
1 289
2 4912
4 7 1013
6 8 1115
再取7與7比較,找到目標數字,返回true。
1 289
2 4912
4 7
1013
6 8 1115
這樣就可以寫出下面的**:
#include using namespace std;
bool find(int *matrix, int rows, int columns, int number)
else if (matrix[row*columns + column] > number)
--column;
else
++row;
}} return find;
}int main()
,,, };
bool result=find(a[0], 4, 4,7);//這裡的a[0]要十分注意
if (result == true) printf_s("true");
else
return 0; }
//a[0]是乙個指標變數,它指向陣列[1,2,8,9]的起始位址,也可以看做指向的是1的位址,
//那麼也就是整個二維陣列的首元素的位址。這裡不能寫成a,因為a雖然是二維陣列的首位址
//但是二維陣列是將每個一維陣列看做乙個元素,那麼a+1代表第二行的位址,a[0]+1表示第一行第二個
//元素的位址,這是完全不一樣的,千萬注意。
複習:
第二次做的時候想到了用右邊的列來縮小查詢範圍,但是忽略了對稱的利用行也可以減少範圍的情況,以後考慮問題要學會關聯這種對稱的情況。
二刷**:
bool find(int*matrix, int rows, int columns, int number)
else if (matrix[row*columns + column] >number)
else
++rows;
} }return find;
}
劍指offer面試題4 二維陣列的查詢
題目 二維陣列的查詢 在乙個二位陣列中,每一行都遞增,每一列的遞增,請完成乙個函式,查詢二維陣列中是否有number 方案 只需要每次從二維陣列的右上角開始查詢就可以了,因為如果右上角的數字都大於要查詢的number的話,那麼這一列肯定都大於number,我們只需要在剩下的列中找就行了,如果右上角的...
劍指offer面試題4 二維陣列中的查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。include include using namespace std class solution else...
劍指offer 面試題4 二維陣列中的查詢
在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。class solution def find self,array,target 判斷陣列是否為空 if a...