LeetCode(74):搜索二维矩阵

Medium!

题目描述:

编写一个高效的算法来判断 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

解题思路:

这道题要求搜索一个二维矩阵,由于给的矩阵是有序的,所以很自然的想到要用二分查找法,我们可以在第一列上先用一次二分查找法找到目标值所在的行的位置,然后在该行上再用一次二分查找法来找是否存在目标值。

C++解法一:

复制代码
 1 // Two binary search
 2 class Solution {
 3 public:
 4     bool searchMatrix(vector<vector<int> > &matrix, int target) {
 5         if (matrix.empty() || matrix[0].empty()) return false;
 6         if (target < matrix[0][0] || target > matrix.back().back()) return false;
 7         int left = 0, right = matrix.size() - 1;
 8         while (left <= right) {
 9             int mid = (left + right) / 2;
10             if (matrix[mid][0] == target) return true;
11             else if (matrix[mid][0] < target) left = mid + 1;
12             else right = mid - 1;
13         }
14         int tmp = right;
15         left = 0;
16         right = matrix[tmp].size() - 1;
17         while (left <= right) {
18             int mid = (left + right) / 2;
19             if (matrix[tmp][mid] == target) return true;
20             else if (matrix[tmp][mid] < target) left = mid + 1;
21             else right = mid - 1;
22         }
23         return false;
24     }
25 };
复制代码

这道题也可以使用一次二分查找法,如果我们按S型遍历该二维数组,可以得到一个有序的一维数组,那么我们只需要用一次二分查找法,而关键就在于坐标的转换,如何把二维坐标和一维坐标转换是关键点,把一个长度为n的一维数组转化为m*n的二维数组(m*n = n)后,那么原一维数组中下标为i的元素将出现在二维数组中的[i/n][i%n]的位置,有了这一点,代码很好写出来了。

C++解法二:

复制代码
 1 // One binary search
 2 class Solution {
 3 public:
 4     bool searchMatrix(vector<vector<int> > &matrix, int target) {
 5         if (matrix.empty() || matrix[0].empty()) return false;
 6         if (target < matrix[0][0] || target > matrix.back().back()) return false;
 7         int m = matrix.size(), n = matrix[0].size();
 8         int left = 0, right = m * n - 1;
 9         while (left <= right) {
10             int mid = (left + right) / 2;
11             if (matrix[mid / n][mid % n] == target) return true;
12             else if (matrix[mid / n][mid % n] < target) left = mid + 1;
13             else right = mid - 1;
14         }
15         return false;
16     }
17 };
复制代码

 

posted @   Ariel_一只猫的旅行  阅读(470)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示