劍指Offer面試題3 二維陣列中的查詢
阿新 • • 發佈:2018-11-11
題目描述:在一個二維陣列中(每個一維陣列的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
1 | 2 | 8 | 9 |
2 | 4 | 9 | 12 |
4 | 7 | 10 | 13 |
6 | 8 | 11 | 15 |
分析:將這個二維陣列畫成一個矩形matrix,然後從陣列中選取一個數字value(待查詢的數字為num),若matrix中含有num則分3種情況進行查詢。
①value等於num,查詢結束,函式返回true。②value大於num,根據陣列排列的規律,待查詢的數出現的範圍在value的下面或左面。②value小於num,根據陣列排列的規律,待查詢的數出現的範圍在value的上面或右面。
若matrix中不含有num則函式返回false。
出現的問題:由於要查詢的數num的位置範圍有2個,而且這2個範圍還有重疊的地方,使問題變得複雜。
解決的辦法
總結:選取陣列右上角的數字value。若value等於待查詢數num查詢過程結束;若value大於num,剔除value所在的列;若value小於num,剔除value所在的行。這樣每一步都可以縮小查詢的範圍。
#include <iostream> using namespace std; bool Find(int* Matrix,int rows,int columns,int number) { bool found=false; if(Matrix != NULL && rows >0 && columns >0) { int row=0; int column=columns-1; while(row<rows && column>0) { if(Matrix[row*column+column] == number) { found=true; break; } else if(Matrix[row*column+column] > number) --column; else ++row; } } return found; } int main() { bool result; int matrix[4][4] = {1,2,8,9,2,4,9,12,4,7,10,13,6,8,11,15}; int* p = matrix[0]; result=Find(p,4,2,8); cout << result << endl; }