LeetCode 74:Search a 2D Matrix
Posted blfbuaa
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 74:Search a 2D Matrix相关的知识,希望对你有一定的参考价值。
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的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 74 Search a 2D Matrix ----- java
LeetCode 74.Search a 2D Matrix Java
19.2.13 [LeetCode 74] Search a 2D Matrix
[LeetCode] 74. Search a 2D Matrix 搜索一个二维矩阵