搜索二维矩阵 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
思路:为了提升查找的速率一般要用折半查找,先对第一行进行折半查找,如果没有找到那么根据折半的特性最后一次比较的数一定是小于目标值的最大数,假设为a,那么再根据该二维数组的特性可知在下一行的同一位置元素b的值一定是大于a,目标元素只可能出现在b的前面,假设b前一个元素是c,如果c是大于目标的那么目标才有可能在该行,若小于则必然不可能在该行找到便可以直接跳过,到下一行。直到找到合适的行再进行折半查找若没有找到再重复以上步骤,
#include<iostream>
using namespace std;
int mk[][5]={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};
bool searchMatrix(int m,int n,int t);
int main()
{
cout<<searchMatrix(5,5,15);
return 0;
}
bool searchMatrix(int m,int n,int t)
{
int i=0,a=0,b=n-1,c=(a+b)/2;
while(i<m)
{
if(mk[i][a]<=t && mk[i][b]>=t)
{
while(a<=b)
{
if(t<mk[i][c])
{
b=c-1;
c=(a+b)/2;
}
else if(t>mk[i][c])
{
a=c+1;
c=(a+b)/2;
}
else
return true;
}
a=0;
b=c;
}
else
i++;
}
return false;
}