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;
}