LeetCode 74:Search a 2D Matrix
阿新 • • 發佈:2017-06-15
amp san mark matrix pause 二分查找 div 執行 _id
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:
- Integers in each row are sorted from left to right.
- The first integer of each row is greater than the last integer of the previous row.
For example,
Consider the following matrix:
[ [1, 3, 5, 7], [10, 11, 16, 20], [23, 30, 34, 50] ]
Given target = 3
, return true
.
Subscribe to see which companies asked this question
方法一:
1.先在全部行中利用二分查找target所在行;
2.然後target所在行進行二分查找target
class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.size() == 0) return false; if (matrix[0][0] > target) return false; int r = matrix.size(), c = matrix[0].size(); //r,c分別為矩陣matrix的行數和列數 int low = 0, high = r-1; //在全部行中利用二分查找target所在的行 while(low <= high) { int mid = low + (high-low) / 2; if (matrix[mid][0] == target) return true; else if (matrix[mid][0] < target) low = mid + 1; else high = mid - 1; } //在target所在行中利用二分查找target int low1 = 0, high1 = c - 1; int k = 0; while (low1 <= high1) { int mid1 = low1 + (high1 - low1)/2; if (matrix[low-1][mid1] == target) //註意target所在的行是(low-1) return true; else if (matrix[low-1][mid1] < target) low1 = mid1 + 1; else high1 = mid1 - 1; k = mid1; } if (matrix[low-1][k] == target) return true; else return false; } };
方法二:將矩陣看成數組,利用二分查找。執行時間12ms,時間復雜度O(log(mn)),將m*n的矩陣看成數組,即matrix[x][y]=>a[x*n+y]。數組也能夠轉回m*n矩陣。即a[x]=>matrix[x/n][x%n]
註:此方法為參考leetcode solution中的C++ 12ms方法
//方法二: //將矩陣看成數組,利用二分查找,執行時間12ms,時間復雜度O(log(mn)) //將m*n的矩陣看成數組,即matrix[x][y]=>a[x*n+y] //數組也能夠轉回m*n矩陣。即a[x]=>matrix[x/n][x%n] class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.empty()) return false; int m = matrix.size(), n = matrix[0].size(); int low = 0, high = m*n - 1; while (low<=high) { int mid = low + (high - low) / 2; int value = matrix[mid / n][mid%n]; if (value == target) return true; else if (value < target) low = mid + 1; else high = mid - 1; } return false; } };
測試代碼:
#include<iostream> #include<vector> #include<algorithm> using namespace std; class Solution { public: bool searchMatrix(vector<vector<int>>& matrix, int target) { if (matrix.size() == 0) return false; if (matrix[0][0] > target) return false; int r = matrix.size(), c = matrix[0].size(); //r,c分別為矩陣matrix的行數和列數 int low = 0, high = r-1; //在全部行中利用二分查找target所在的行 while(low <= high) { int mid = low + (high-low) / 2; if (matrix[mid][0] == target) return true; else if (matrix[mid][0] < target) low = mid + 1; else high = mid - 1; } //在target所在行中利用二分查找target int low1 = 0, high1 = c - 1; int k = 0; while (low1 <= high1) { int mid1 = low1 + (high1 - low1)/2; if (matrix[low-1][mid1] == target) //註意target所在的行是(low-1) return true; else if (matrix[low-1][mid1] < target) low1 = mid1 + 1; else high1 = mid1 - 1; k = mid1; } if (matrix[low-1][k] == target) return true; else return false; } }; int main() { Solution s; vector<vector<int>> nums1 = { { 1, 3, 5, 7 }, { 10, 11, 16, 20 }, {23,30,34,50} }; bool t = s.searchMatrix(nums1, 11); cout << t <<endl; system("pause"); return 0; }
LeetCode 74:Search a 2D Matrix