原題**:
寫出乙個高效的演算法來搜尋 m × n矩陣中的值。
這個矩陣具有以下特性:
您在真實的面試中是否遇到過這個題?
yes樣例考慮下列矩陣:
[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
給出target = 3
,返回true
挑戰
o(log(n) + log(m)) 時間複雜度
#include #include#include
#include
#include
using
namespace
std;
//方法一:展開成一維陣列,二分法查詢;
bool searchmatrix(vectorint>> &matrix, int
target)
int row=matrix.size();
int col=matrix[0
].size();
if (target0][0]||target>matrix[row-1][col-1
])
vector
temp;
for (int i=0;i)
}//二分法查詢;
int size=temp.size();
int count=0
;
int max=size-1,mid=size/2,min=0; //
mid=(max+min)/2;
while(count!=size)
else
if (targetelse
mid=(max+min)/2
; count ++;
}return
false;}
//方法二:對行和列分別進行二分法查詢;
bool searchmatrix_w(vectorint>> &matrix, int
target)
int row=matrix.size();
int col=matrix[0
].size();
if (target0][0]||target>matrix[row-1][col-1
])
//二分法查詢行;
int rowindex=0
;
int rowlow=0,rowhigh=row-1,rowmid=(rowhigh+rowlow)/2
;
while(rowlow<=rowhigh)
else
if (target>matrix[rowmid][0]&&target1
])
else
if (targetmatrix[rowmid][0
])
else
rowmid=(rowhigh+rowlow)/2
; }
//二分法查詢列;
int collow=0,colhigh=col-1,colmid=(colhigh+collow)/2
;
while(collow<=colhigh)
else
if (targetelse
colmid=(colhigh+collow)/2
; }
return
false
;}
參考:1
2
28 搜尋二維矩陣
5.2 可能是剛開始想複雜了吧。大致思路就是先確定某一行,再確定這一行中是不是含有就可以了。確定列的時候採用二分查詢是沒有問題的。在查詢行的時候也想用二分查詢,但是出現了一些問題,查詢不準確。後來想,就是找到首元素小於target的最大值那一行就可以了。然後後來在判斷一下。如果 nums 行 尾元素...
LintCode 28 搜尋二維矩陣
寫出乙個高效的演算法來搜尋 m n矩陣中的值。這個矩陣具有以下特性 每行中的整數從左到右是排序的。每行的第乙個數大於上一行的最後乙個整數。樣例 考慮下列矩陣 1,3,5,7 10,11,16,20 23,30,34,50 給出 target 3,返回 true 挑戰 o log n log m 時間...
《Lintcode簽到》 28 搜尋二維矩陣
寫出乙個高效的演算法來搜尋 m n矩陣中的值。這個矩陣具有以下特性 每行中的整數從左到右是排序的。每行的第乙個數大於上一行的最後乙個整數。樣例樣例 1 輸入 5 2 輸出 false 樣例解釋 沒有包含,返回false。樣例 2 輸入 1,3,5,7 10,11,16,20 23,30,34,50 ...