首页 > 代码库 > LeetCode 74:Search a 2D Matrix
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 = http://www.mamicode.com/matrix[mid / n][mid%n];>測试代码:
#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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。