一、題目
二、思路分析
思想:想辦法縮小查詢範圍,即想辦法去剔除掉某行或者某列。
例子:
1、當從數組中隨便選取一個數字時,將這個數字與要查找的數字比較後無論大了或小了,都沒有規律可循。
2、當每次都從左上或者右下選取數字時,也沒辦法縮小查詢範圍,沒有規律可循。
3、當每次都從右上或者左下選取數字時,發現每次可以剔除掉一行或者一列,以每次從右上角開始爲例,具體如下:
(1)如果該數字等於要查找的數字,則查找過程結束;
(2)如果該數字大於要查找的數字,則剔除這個數字所在的列;
(3)如果該數字小於要查找的數字,則剔除這個數字所在的行。
三、C++代碼實現
1、在牛客網編輯框寫的代碼
性能:
2、在VS中運行的完整代碼
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public://類、公有成員、成員函數
bool Find(int target, vector<vector<int> > array) {//用vector類聲明瞭一個二維數組對象array
int rows = array.size();//.表示對象的成員運算符,array.size()表示的是array的行數
int cols = array[0].size();//array[0].size()表示的是第一行的列數
if (!array.empty() && rows>0 && cols>0) {
int row = 0;
int col = cols - 1;
while (row<rows&&col >= 0) {
if (array[row][col] == target) {
cout << "find!" << endl;
return true;
}
else if (array[row][col]>target) {
--col;
}
else {
++row;
}
}
}
cout << "not find" << endl;
return false;
}
};
int main()
{
Solution answer;//聲明瞭一個對象
int array_temp[4][4] = { 1,2,8,9,
2,4,9,12,
4,7,10,13,
6,8,11,15
};
int i, j;
int target=7;
vector<vector<int>> array(4);//聲明瞭一個4行的二維動態數組
for (i = 0; i<array.size(); i++)
{
array[i].resize(4);//重置array的每一行向量的元素個數,即每一行有多少列,這裏都是4列
}
for (i = 0; i<array.size(); i++)
{
for (j = 0; j<array[0].size(); j++)
{
array[i][j] = array_temp[i][j];
}
}
answer.Find(target, array);//這個類對象調用類的成員函數
getchar();
}