牛客網劍指offer“數組類型”第1題——二維數組中的查找

一、題目

二、思路分析

思想:想辦法縮小查詢範圍,即想辦法去剔除掉某行或者某列。

例子:

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();
}

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章