73.矩陣置零
給定一個 m x n 的矩陣,如果一個元素為 0 ,則將其所在行和列的所有元素都設為 0 。請使用 原地 算法。
int m = matrix.size(); // 行數int n = matrix[0].size(); // 列數bool firstRowZero = false; // 標記第一行是否包含 0bool firstColZero = false; // 標記第一列是否包含 0// 1. 檢查第一行和第一列是否包含 0for (int j = 0; j < n; ++j) {if (matrix[0][j] == 0) {firstRowZero = true;break;}}for (int i = 0; i < m; ++i) {if (matrix[i][0] == 0) {firstColZero = true;break;}}// 2. 使用第一行和第一列作為標記位for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (matrix[i][j] == 0) {matrix[i][0] = 0; // 標記第 i 行需要置零matrix[0][j] = 0; // 標記第 j 列需要置零}}}// 3. 根據標記位將對應的行和列置零(除了第一行和第一列)for (int i = 1; i < m; ++i) {for (int j = 1; j < n; ++j) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}// 4. 根據 firstRowZero 和 firstColZero 將第一行和第一列置零if (firstRowZero) {for (int j = 0; j < n; ++j) {matrix[0][j] = 0;}}if (firstColZero) {for (int i = 0; i < m; ++i) {matrix[i][0] = 0;}}
54.螺旋矩陣
給你一個 m 行 n 列的矩陣 matrix ,請按照 順時針螺旋順序 ,返回矩陣中的所有元素。
vector<int> result;if (matrix.empty()) {return result;}int top = 0, bottom = matrix.size() - 1;int left = 0, right = matrix[0].size() - 1;while (top <= bottom && left <= right) {// 1. 從左到右for (int i = left; i <= right; ++i) {result.push_back(matrix[top][i]);}top++;// 2. 從上到下for (int i = top; i <= bottom; ++i) {result.push_back(matrix[i][right]);}right--;if (top <= bottom && left <= right) { // 避免重復添加// 3. 從右到左for (int i = right; i >= left; --i) {result.push_back(matrix[bottom][i]);}bottom--;// 4. 從下到上for (int i = bottom; i >= top; --i) {result.push_back(matrix[i][left]);}left++;}}return result;
48.旋轉圖像
給定一個 n × n 的二維矩陣 matrix 表示一個圖像。請你將圖像順時針旋轉 90 度。
你必須在 原地 旋轉圖像,這意味著你需要直接修改輸入的二維矩陣。請不要 使用另一個矩陣來旋轉圖像。
int n = matrix.size();// 1. 轉置矩陣for (int i = 0; i < n; ++i) {for (int j = i + 1; j < n; ++j) { // 注意 j 從 i+1 開始,避免重復交換swap(matrix[i][j], matrix[j][i]);}}// 2. 反轉每一行for (int i = 0; i < n; ++i) {reverse(matrix[i].begin(), matrix[i].end());}
240.搜索二維矩陣(二)
編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性:
每行的元素從左到右升序排列。
每列的元素從上到下升序排列。
if (matrix.empty() || matrix[0].empty()) {return false;}int m = matrix.size(); // 行數int n = matrix[0].size(); // 列數int row = 0; // 從第一行開始int col = n - 1; // 從最后一列開始while (row < m && col >= 0) {if (matrix[row][col] == target) {return true; // 找到了目標值} else if (matrix[row][col] < target) {row++; // 目標值更大,向下移動一行} else {col--; // 目標值更小,向左移動一列}}return false; // 沒有找到目標值