编写一个高效的算法来判断 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
1 #include "_000库函数.h" 2 3 4 //题目要求使用高效算法,但不知最高效的是哪个 5 //本解法复杂度为m+n 6 class Solution { 7 public: 8 bool searchMatrix(vector<vector<int>>& matrix, int target) { 9 if (matrix.empty() || matrix[0].empty())return false; 10 int m = matrix.size(); 11 int n = matrix[0].size(); 12 if (target< matrix[0][0] || target>matrix[m - 1][n - 1])return false; 13 for (int i = 0; i < m; ++i) 14 if (target >= matrix[i][0] && target <= matrix[i][n - 1]) { 15 for (int j = 0; j < n; ++j) 16 if (target == matrix[i][j])return true; 17 return false; 18 } 19 return false; 20 } 21 }; 22 23 //当然这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组, 24 //可以得到一个有序的一维数组,那么我们只需要用一次二分查找法, 25 //而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点, 26 //把一个长度为n的一维数组转化为m*n的二维数组(m*n = n)后, 27 //那么原一维数组中下标为i的元素将出现在二维数组中的[i / n][i%n]的位置, 28 // 29 30 // One binary search 31 class Solution { 32 public: 33 bool searchMatrix(vector<vector<int> > &matrix, int target) { 34 if (matrix.empty() || matrix[0].empty()) return false; 35 if (target < matrix[0][0] || target > matrix.back().back()) return false; 36 int m = matrix.size(), n = matrix[0].size(); 37 int left = 0, right = m * n - 1; 38 while (left <= right) { 39 int mid = (left + right) / 2; 40 if (matrix[mid / n][mid % n] == target) return true; 41 else if (matrix[mid / n][mid % n] < target) left = mid + 1; 42 else right = mid - 1; 43 } 44 return false; 45 } 46 }; 47 48 void T074() { 49 Solution s; 50 vector<vector<int>>v; 51 v = { {1,3,5,7},{10,11,16,20},{23,30,34,50} }; 52 cout << s.searchMatrix(v, 3) << endl; 53 cout << s.searchMatrix(v, 13) << endl; 54 55 56 }