1.矩阵置零
给定一个m×n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都设置为0。请使用原地算法。
思路:利用第一行和第一列来存储矩阵中0所在的行和列。
void setZeroes(vector<vector<int>>& matrix) {
int rows = matrix.size();
int cols = 0;
bool rows_exist = false;
bool cols_exist = false;
if(rows != 0)
{
cols = matrix[0].size();
}
//判断第一行是否原本有0
for(int j = 0; j < cols; j++)
{
if(matrix[0][j] == 0)
{
rows_exist = true;
}
}
//判断第一列是否原本有0
for(int i = 0; i < rows; i++)
{
if(matrix[i][0] == 0)
{
cols_exist = true;
}
}
//判断矩阵中其他存在0的行和列
for(int i = 1; i < rows; i++)
{
for(int j = 1; j < cols; j++)
{
if(matrix[i][j] == 0)
{
matrix[i][0] = 0;
matrix[0][j] = 0;
}
}
}
for(int i = 1; i < rows; i++)
{
for(int j = 1; j < cols; j++)
{
if(matrix[i][0] == 0 || matrix[0][j] == 0)
{
matrix[i][j] = 0;
}
}
}
//处理第一行
if(rows_exist)
{
for(int j = 0; j < cols; j++)
{
matrix[0][j] = 0;
}
}
//处理第一列
if(cols_exist)
{
for(int i = 0; i < rows; i++)
{
matrix[i][0] = 0;
}
}
}
2.搜索二维矩阵
编写一个高效的算法来判断m×n矩阵中,是否存在一个目标值。该矩阵具有如下特性:
- 每行中的整数从左到右按升序排列
- 每行的第一个整数大于前一行的最后一个整数
思路:先确定target所在的行,然后用二分查找
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int rows = matrix.size();
int cols = 0;
if(rows != 0)
{
cols = matrix[0].size();
}
if(cols == 0)
{
return false;
}
for(int i = 0; i < rows; i++)
{
if(target > matrix[i][cols - 1])
{
continue;
}
else
{
int start = 0;
int end = cols - 1;
if(start < end)
{
while(matrix[i][start] < target && start < end)
{
start++;
}
while(matrix[i][end] > target && start < end)
{
end--;
}
}
if(matrix[i][start] == target || matrix[i][end] == target)
{
return true;
}
}
}
return false;
}