240. 搜索二维矩阵 II(二分查找)

240. 搜索二维矩阵 II

编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:

  • 每行的元素从左到右升序排列。
  • 每列的元素从上到下升序排列。

 

示例 1:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5
输出:true

示例 2:

输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 20
输出:false

 

提示:

  • m == matrix.length
  • n == matrix[i].length
  • 1 <= n, m <= 300
  • -109 <= matrix[i][j] <= 109
  • 每行的所有元素从左到右升序排列
  • 每列的所有元素从上到下升序排列
  • -109 <= target <= 109

方法一:(二分查找)

复制代码
 1 1 class Solution {
 2  2 public:
 3  3     bool binarySearch(const vector<int> &vec, int target) {
 4  4         int left = 0;
 5  5         int right = vec.size() - 1;
 6  6         while (left <= right) {
 7  7             int mid = left + (right - left) / 2;
 8  8             if (vec[mid] == target) {
 9  9                 return true;
10 10             }
11 11             if (vec[mid] < target) { // 目标值在区间[mid + 1, right]
12 12                 left = mid + 1;
13 13             } else { // 目标值在区间[left, mid - 1]
14 14                 right = mid - 1;
15 15             }
16 16         }
17 17         return false;
18 18     }
19 19     bool searchMatrix(vector<vector<int>>& matrix, int target) {
20 20         if (matrix.size() == 0 || matrix[0].size() == 0) {
21 21             return false;
22 22         }
23 23         int n = matrix.size();
24 24         int m = matrix[0].size();
25 25         // 遍历每一行查找目标值是否存在
26 26         for (int i = 0; i < n; i++) {
27 27             // 如果只存在一列,查找每一行元素是否目标值一样
28 28             if (m == 1) {
29 29                 if (matrix[i][0] == target) {
30 30                     return true;
31 31                 }
32 32             } else { // 二维数组多于1列,查找每一行是否存在目标值
33 33                 if (binarySearch(matrix[i], target)) {
34 34                     return true;
35 35                 }
36 36             }
37 37         }
38 38         return false;
39 39     }
40 40 };
复制代码

方法二:(Z行查找)

复制代码
 1 class Solution {
 2 public:
 3     bool searchMatrix(vector<vector<int>>& matrix, int target) {
 4         if (matrix.size() == 0 || matrix[0].size() == 0) {
 5             return false;
 6         }
 7         // 初始位置左下角
 8         int x = matrix.size() - 1;
 9         int y = 0;
10         // 只要不超过右上角
11         while (x >= 0 && y <= matrix[0].size() - 1) {
12             // 如果当前位置元素比目标值大,则目标在上一行
13             if (matrix[x][y] > target) {
14                 x--;
15             } else if (matrix[x][y] < target) { // 当前位置元素比目标值小,则目标值在下一列
16                 y++;
17             } else {
18                 return true;
19             }
20         }
21         return false;
22     }
23 };
复制代码

 

posted @   跳动的休止符  阅读(65)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示