classSolution { public: voidsetZeroes(vector<vector<int>>& matrix){ int nRow = matrix.size(); int nCol = matrix[0].size(); bool firstRow = false; bool firstCol = false; for (int i = 0; i < nRow; ++i) if (matrix[i][0] == 0) firstCol = true; for (int i = 0; i < nCol; ++i) if (matrix[0][i] == 0) firstRow = true;
for (int i = 1; i < nRow; ++i) for (int j = 1; j < nCol; ++j) if (matrix[i][j] == 0) matrix[i][0] = matrix[0][j] = 0; for (int i = 1; i < nRow; ++i) for (int j = 1; j < nCol; ++j) if (matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0; if (firstCol == true) for (int i = 0; i < nRow; ++i) matrix[i][0] = 0; if (firstRow == true) for (int i = 0; i < nCol; ++i) matrix[0][i] = 0; } };
classSolution: defsetZeroes(self, matrix: List[List[int]]) -> None: nRow = len(matrix) nCol = len(matrix[0]) firstRow = False firstCol = False for i inrange(nRow): if (matrix[i][0] == 0): firstCol = True for i inrange(nCol): if (matrix[0][i] == 0): firstRow = True
for i inrange(1, nRow): for j inrange(1, nCol): if (matrix[i][j] == 0): matrix[i][0] = matrix[0][j] = 0 for i inrange(1, nRow): for j inrange(1, nCol): if (matrix[i][0] == 0or matrix[0][j] == 0): matrix[i][j] = 0 if (firstCol == True): for i inrange(nRow): matrix[i][0] = 0 if (firstRow == True): for i inrange(nCol): matrix[0][i] = 0
classSolution { publicvoidsetZeroes(int[][] matrix) { intnRow= matrix.length; intnCol= matrix[0].length; booleanfirstFlag=false; for (inti=0; i < nRow; ++i) { if (matrix[i][0] == 0) firstFlag = true; for (intj=1; j < nCol; ++j) if (matrix[i][j] == 0) matrix[i][0] = matrix[0][j] = 0; } for (inti= nRow - 1; i >= 0; --i) { for (intj=1; j < nCol; ++j) if (matrix[i][0] == 0 || matrix[0][j] == 0) matrix[i][j] = 0; if (firstFlag == true) matrix[i][0] = 0; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution: defsetZeroes(self, matrix: List[List[int]]) -> None: nRow = len(matrix) nCol = len(matrix[0]) flag = False for i inrange(nRow): if (matrix[i][0] == 0): flag = True for j inrange(1, nCol): if (matrix[i][j] == 0): matrix[i][0] = matrix[0][j] = 0 for i inreversed(range(nRow)): for j inrange(1, nCol): if (matrix[i][0] == 0or matrix[0][j] == 0): matrix[i][j] = 0 if flag == True: matrix[i][0] = 0
classSolution { public: vector<int> spiralOrder(vector<vector<int>>& matrix){ if (matrix.size() == 0 || matrix[0].size() == 0) return {}; int bottom = matrix.size() - 1; int right = matrix[0].size() - 1; vector<int> results; int left = 0, top = 0; while (left <= right && top <= bottom) { for (int i = left; i <= right; ++i) results.emplace_back(matrix[top][i]); for (int i = top + 1; i <= bottom; ++i) results.emplace_back(matrix[i][right]); if (left < right && top < bottom) // 到这里可能剩余不足围成圈,如1*n或n*1,此时前两个循环已经足够处理,如果不加以限制,那么在n大于1的情况下,下述的循环将会有一个进入导致最后结尾出现多余的数据 { for (int i = right - 1; i > left; --i) results.emplace_back(matrix[bottom][i]); for (int i = bottom; i > top; --i) results.emplace_back(matrix[i][left]); } ++left; ++top; --bottom; --right; } return results; } };
classSolution { public List<Integer> spiralOrder(int[][] matrix) { intbottom= matrix.length - 1; intright= matrix[0].length - 1; List<Integer> results = newArrayList<>(); intleft=0, top = 0; if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return results; while (left <= right && top <= bottom) { for (inti= left; i <= right; ++i) results.add(matrix[top][i]); for (inti= top + 1; i <= bottom; ++i) results.add(matrix[i][right]); if (left < right && top < bottom) { for (inti= right - 1; i > left; --i) results.add(matrix[bottom][i]); for (inti= bottom; i > top; --i) results.add(matrix[i][left]); } ++left; ++top; --bottom; --right; } return results; } }
1 2 3 4 5 6 7 8 9 10 11 12 13
classSolution: defspiralOrder(self, matrix: List[List[int]]) -> List[int]: bottom, right = len(matrix) - 1, len(matrix[0]) - 1 results = list() left, top = 0, 0 while left <= right and top <= bottom: for i inrange(left, right + 1): results.append(matrix[top][i]) for i inrange(top + 1, bottom + 1): results.append(matrix[i][right]) if left < right and top < bottom: for i inrange(right - 1, left, -1): results.append(matrix[bottom][i]) for i inrange(bottom, top, -1): results.append(matrix[i][left]) left, right, top, bottom = left + 1, right - 1, top + 1, bottom - 1 return results
四:旋转图像
1. 辅助数组
将旋转后的元素放入新的数组
1 2 3 4 5 6 7 8 9 10 11
classSolution { public: voidrotate(vector<vector<int>>& matrix){ auto result = matrix; int m = matrix.size(); for (int i = 0; i < m; ++i) for (int j = 0; j < m; ++j) result[j][m - 1 - i] = matrix[i][j]; matrix.assign(result.begin(), result.end()); } };
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { publicvoidrotate(int[][] matrix) { intm= matrix.length; int[][] result = newint[m][m]; for (inti=0; i < m; ++i) for (intj=0; j < m; ++j) result[j][m - 1 - i] = matrix[i][j]; for (inti=0; i < m; i++) { System.arraycopy(result[i], 0, matrix[i], 0, m); } } }
1 2 3 4 5 6 7 8
classSolution: defrotate(self, matrix: List[List[int]]) -> None: n = len(matrix) result = [[0] * n for _ inrange(n)] for i inrange(n): for j inrange(n): result[j][n - 1 - i] = matrix[i][j] matrix[:] = result
classSolution: defrotate(self, matrix: List[List[int]]) -> None: m = len(matrix) for i inrange(m // 2): for j inrange((m + 1) // 2): temp = matrix[i][j] matrix[i][j] = matrix[m - 1 - j][i] matrix[m - j - 1][i] = matrix[m - i - 1][m - j - 1] matrix[m - i - 1][m - j - 1] = matrix[j][m - i - 1] matrix[j][m - 1 - i] = temp
3. 翻转
先水平后主对角线,也可以先竖直
1 2 3 4 5 6 7 8 9 10 11 12
classSolution { public: voidrotate(vector<vector<int>>& matrix){ int m = matrix.size(); for (int i = 0; i < m / 2; ++i) for (int j = 0; j < m; ++j) swap(matrix[i][j], matrix[m - i - 1][j]); for (int i = 0; i < m; ++i) for (int j = 0; j < i; ++j) swap(matrix[i][j], matrix[j][i]); } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { publicvoidrotate(int[][] matrix) { intm= matrix.length; for (inti=0; i < m / 2; ++i) for (intj=0; j < m; ++j) { inttemp= matrix[i][j]; matrix[i][j] = matrix[m - i - 1][j]; matrix[m - i - 1][j] = temp; } for (inti=0; i < m; ++i) for (intj=0; j < i; ++j) { inttemp= matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } }
1 2 3 4 5 6 7 8 9
classSolution: defrotate(self, matrix: List[List[int]]) -> None: m = len(matrix) for i inrange(m // 2): for j inrange(m): matrix[i][j], matrix[m - i - 1][j] = matrix[m - i - 1][j], matrix[i][j] for i inrange(m): for j inrange(i): matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
五:搜索二维矩阵
1. 暴力
不写
2. 二分
由于数组左右有序,对每一行使用二分从中间查找
1 2 3 4 5 6 7 8 9 10 11
classSolution { public: boolsearchMatrix(vector<vector<int>>& matrix, int target){ for (auto& row : matrix) { auto it = lower_bound(row.begin(), row.end(), target); // 返回不小于目标值的第一个元素的迭代器 if (it != row.end() && *it == target) returntrue; } returnfalse; } };
classSolution { publicbooleansearchMatrix(int[][] matrix, int target) { for (int[] row : matrix) { intindex= searchInsert(row, target); if (index != -1) returntrue; } returnfalse; } publicintsearchInsert(int[] nums, int target) { intleft=0, right = nums.length - 1, cur = right + 1; while (left <= right) { intmid= ((right - left) >> 1) + left; // 防止int越界 if (target == nums[mid]) return mid; elseif (target < nums[mid]) right = mid - 1; else left = mid + 1; } return -1; } }
1 2 3 4 5 6
classSolution: defsearchMatrix(self, matrix: List[List[int]], target: int) -> bool: for row in matrix: it = bisect.bisect_left(row, target) if it < len(row) and row[it] == target: returnTrue returnFalse
classSolution { public: boolsearchMatrix(vector<vector<int>>& matrix, int target){ int m = matrix.size(); int n = matrix[0].size(); int i = 0, j = n - 1; while (i < m && j >= 0) { if (matrix[i][j] == target) returntrue; elseif (matrix[i][j] > target) --j; elseif(matrix[i][j] < target) ++i; } returnfalse; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14
classSolution { publicbooleansearchMatrix(int[][] matrix, int target) { intm= matrix.length; intn= matrix[0].length; inti=0, j = n - 1; while (i < m && j >= 0) { if (matrix[i][j] == target) returntrue; elseif (matrix[i][j] > target) --j; elseif(matrix[i][j] < target) ++i; } returnfalse; } }
1 2 3 4 5 6 7 8 9 10 11
classSolution: defsearchMatrix(self, matrix: List[List[int]], target: int) -> bool: m = len(matrix) n = len(matrix[0]) i = 0 j = n - 1 while i < m and j >= 0: if (matrix[i][j] == target): returnTrue elif (matrix[i][j] > target): j -= 1 elif(matrix[i][j] < target): i += 1 returnFalse