1、题目描述
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:
每行中的整数从左到右按升序排列。
每行的第一个整数大于前一行的最后一个整数。
2、示例
输入:
matrix = [
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3
输出: true
3、题解
简化版:从左下角出发,比target大就上移,比target小就下移
基本思想:二分查找,将二维数组matrix看成一维数组,下标为mid的值在二维数组对应值为matrix[mid/m][mid%m]。
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//简化版:从左下角出发,比target大就上移,比target小就下移
int n = matrix.size(), m = matrix[0].size();
int i=n-1,j=0;
while(i<0||j>=m)
{
if(matrix[i][j]==target)
return true;
else if(matrix[i][j]>target)
i--;
else
j++;
}
return false;
}
};
class Solution1 {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
//基本思想:二分查找,将二维数组matrix看成一维数组,下标为mid的值在二维数组对应值为matrix[mid/m][mid%m]
if (matrix.size() == 0)
return false;
int low, mid, high;
int n = matrix.size(), m = matrix[0].size();
low = 0;
high = n * m - 1;
while (low <= high)
{
mid = (low + high) / 2;
if (target == matrix[mid / m][mid % m])
return true;
else if (target > matrix[mid / m][mid % m])
{
low = mid + 1;
}
else
high = mid - 1;
}
return false;
}
};
int main()
{
Solution solute;
vector<vector<int>> matrix = {
{1, 3, 5, 7} ,
{10, 11, 16, 20} ,
{23, 30, 34, 50}
};
int target = 3;
cout << solute.searchMatrix(matrix, target) << endl;
return 0;
}