1、搜索二维矩阵 II
题目
1.0、暴力解法
直接遍历整个二维数组,看一下有没有目标数
bool searchMatrix0(vector<vector<int>>& matrix, int target)
{
for (auto& i : matrix)
for (auto& j : i)
if (j == target)return true;
return false;
}
时间复杂度:O(m n)m是行数,n是列数
空间复杂度:O(1)
1.1、对每一行(或列)进行二分查找
就是对每一行进行二分查找看看有没有目标数,有的话就返回true,没有就继续找下一行
bool searchMatrix1(vector<vector<int>>& matrix, int target)
{
for (auto& i : matrix)
{
int leftIndex = 0, rightIndex = i.size() - 1;
while (leftIndex <= rightIndex)
{
int midIndex = (leftIndex + rightIndex) / 2;
if (i[midIndex] == target)return true;
else if (i[midIndex] < target)leftIndex = midIndex + 1;
else rightIndex = midIndex - 1;
}
}
return false;
}
时间复杂度:O(m log n)每一行二分查找的开销是log n
空间复杂度:O(1)
1.2、Z字型查找
对于数组
我们设定【0,4】到【4,0】的矩形内为查找范围
假设需要查找14,步骤如下:
- 【0,4】> 14,则4减一为3,因为第四列全部数都比14大
- 【0,3】 < 14,则0加一为1,因为第零行全部数都比14小
- 【1,3】 < 14,则1加一为2,因为第一行全部数都比14小
- 【2,3】 > 14,则3减一为2,因为第三列全部数都比14大
- 【2,3】 < 14,则2加一为3,因为第二行全部数都比14小
- 【3,4】 = 14,返回true
- 若row或者col超出边界,则返回false
bool searchMatrix2(vector<vector<int>>& matrix, int target)
{
int rowIndex = 0, colIndex = matrix[0].size() - 1;
while (rowIndex < matrix.size() && colIndex >= 0)
{
if (matrix[rowIndex][colIndex] == target)return true;
else if (matrix[rowIndex][colIndex] > target)colIndex--;
else rowIndex++;
}
return false;
}
时间复杂度:O(m + n)最坏情况是target在左下角,从右上角到左下需要向下走m行,向左走n列
空间复杂度:O(1)