演算法學習記錄一(C++)--->二維陣列中的查詢
描述
- 在一個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函式,輸入這樣的一個二維陣列和一個整數,判斷陣列中是否含有該整數。
- array: 待查詢的二維陣列
target:查詢的數字 - 返回true找到,返回false沒找到
面試題
二維陣列 —–> [[a,a,a,a,a],[b,b,b,b,b],[c,c,c,c,c,c],[d,d,d,d,d]]
最簡單的解法(遍歷)
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int row = 0;
int col = 0;
bool isFound = false;
for(int i=0;i<array.size();i++){
for(int j=0;j<array[i].size();j++){
if(false == isFound && target==array[i][j]){
isFound = true;
break;
}
}
}
return isFound;
}
};
分治解法
目標數字和陣列中對比的陣列無非就是三種情況 > < =
* 那麼當數字相等的時候就找到了的時候
* 那麼當目標數字比陣列中的數字大的時候,必定在右邊或者上邊
* 那麼當目標數字比陣列中的數字小的時候,必定在左邊或者下邊
1.那麼在資料中,target目標數字對比下,比陣列中數字小的必定在左邊或者上邊,比他大的必定在右邊或者下邊
2.那麼考慮下四個角進行開始,理論上,從一個4*4的矩形開始一行或者一列進行縮小,最後鎖定到最小為1*1的矩形,從而找到目標數字,但是這是理論的,有時在這個區間就能找到目標數字
3.但是左上角和右下角,從這兩個點開始的話,例如左上角,如果目標數字比這個大,在矩陣的右邊或者下邊,這就很尷尬了,無法區分,右下角也是一樣
4.那麼我們就要從右上角和左下角開始進行比較,例如右上角,比他大的就是下邊(行+1),比他小的就是左邊(列-1),這樣這個矩形就能慢慢縮小,最終鎖定需要找到的數字
我們根據圖來從右上角分析下
1.9 > 7 那麼深顏色矩形列減少一,向左減少一列
2.8 > 7 還是一樣,矩形繼續想做減少1列
3.2 < 7 目標數字大於陣列,行+1,向下縮小
4.4 < 7 還是小於,繼續向下縮小行
5.7 = 7 找到目標數字
6.可以看出,這種方法每一次減少一行或者一列,效率肯定比遍歷高一點了
右上角開始
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.size() != 0){
int row = 0; // 右上角0行
int col = array[0].size()-1; // 右上角最右邊列
while(row < array.size() && col >= 0){
if(array[row][col]==target) return true;
// 目標數字更小,列減少
else if(array[row][col]>target )col--;
// 目標數字更大,行增加
else row++;
}
}
return false;
}
};
左下角開始
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.size() != 0){
int row = array.size()-1;
int col = 0;
while(col < array[0].size() && row >= 0){
if(array[row][col]==target) return true;
else if(array[row][col]>target )row--;
else col++;
}
}
return false;
}
};
相關文章
- 二維陣列中的查詢陣列
- 【JZOF】二維陣列中的查詢陣列
- 二維陣列查詢陣列
- 劍指offer刷題記錄_2. 二維陣列中的查詢陣列
- 【劍指offer】二維陣列中的查詢陣列
- 劍指 offer 第一題: 二維陣列中的查詢陣列
- 【劍指offer】【1】二維陣列中的查詢陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- Java 學習筆記 二維陣列和物件陣列Java筆記陣列物件
- offer通過--3二維陣列中查詢-2陣列
- C/C++ 二維陣列的理解(多維陣列)C++陣列
- JavaScript 學習筆記 - 多維陣列變為一維陣列JavaScript筆記陣列
- JavaSE 陣列:一維陣列&二維陣列Java陣列
- 劍指Offer積累-JZ1-二維陣列中的查詢陣列
- nowcoder-劍指offer-二維陣列的查詢陣列
- C++查詢一個數是否在陣列中find用法C++陣列
- js 一維陣列轉二維陣列JS陣列
- js 二維陣列轉一維陣列JS陣列
- 二維陣列練習陣列
- c++筆記_多維陣列C++筆記陣列
- C的二維陣列(習題)陣列
- C++ 使用 new 建立二維陣列C++陣列
- 物聯網學習教程——二維陣列的引用陣列
- C++用new建立二維陣列的方法C++陣列
- Java 二維陣列轉一維Java陣列
- c++ -- 二維陣列引數傳遞C++陣列
- 1. 二位陣列中的查詢(劍指offer)陣列
- 【Java】陣列二分查詢元素Java陣列
- 1105學習筆記 陣列的演算法上筆記陣列演算法
- 第一個完整的spring查詢功能學習筆記【Spring工程學習筆記(二)】Spring筆記
- 陣列中查詢給定值陣列
- 二維陣列陣列
- C/C++獲取二維陣列行列數C++陣列
- 陣列的查詢(搜尋):線性查詢和二分法查詢陣列
- 物聯網學習教程——一維陣列的引用陣列
- 查詢陣列中第K大的元素陣列
- JavaScript學習筆記(二)——函式和陣列JavaScript筆記函式陣列
- PHP中二維陣列與多維陣列PHP陣列