51搜尋二維矩陣(74)
作者:
晚於: 2020-08-12 12:00:00後提交分數乘係數50%
截止日期: 2020-08-19 12:00:00
問題描述 :
編寫一個高效的演算法來判斷 m x n 矩陣中,是否存在一個目標值。要求使用二分查詢。
該矩陣具有如下特性:
每行中的整數從左到右按升序排列。
每行的第一個整數大於前一行的最後一個整數。
示例 1:
輸入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
輸出: true
示例 2:
輸入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 13
輸出: false
可使用以下main函式:
int main()
{
vector<vector<int> > matrix;
int target;
int m,n,e;
cin>>m;
cin>>n;
for(int i=0; i<m; i++)
{
vector<int> aRow;
for(int j=0; j<n; j++)
{
cin>>e;
aRow.push_back(e);
}
matrix.push_back(aRow);
}
cin>>target;
bool res=Solution().searchMatrix(matrix,target);
cout<<(res?"true":"false")<<endl;
return 0;
}
輸入說明 :
首先輸入matrix的行數m、列數n,
然後輸入m行,每行n個整數。
最後輸入一個整數target。
輸出說明 :
輸出true或false
輸入範例 :
輸出範例 :
#include <iostream> #include <vector> using namespace std; class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if(matrix.empty()) return false; int l=0; int r=matrix.size()*matrix[0].size()-1; int len=matrix[0].size(); while(l<=r) { int mid=(l+r)/2; if(matrix[mid/len][mid%len]>target) r=mid-1; else if(matrix[mid/len][mid%len]<target) l=mid+1; else return true; } return false; } }; int main() { vector<vector<int> > matrix; int target; int m,n,e; cin>>m; cin>>n; for(int i=0; i<m; i++) { vector<int> aRow; for(int j=0; j<n; j++) { cin>>e; aRow.push_back(e); } matrix.push_back(aRow); } cin>>target; bool res=Solution().searchMatrix(matrix,target); cout<<(res?"true":"false")<<endl; return 0; }
其實就是一個升序序列,用二分法來做,只不過判斷中間節點時要以二維陣列的方法來判斷。