73. 矩阵置零 - 力扣LeetCode一边标记一边改值有读写问题、用两个布尔标记第一行和第一列的是否存在0用第一行和第一列作为剩余位置的是否存在0的标记class Solution { public void setZeroes(int[][] matrix) { int m matrix.length; int n matrix[0].length; boolean rowfalse; boolean colfalse; for(int i0;in;i){ if(matrix[0][i]0){ rowtrue; break; } } for(int i0;im;i){ if(matrix[i][0]0){ coltrue; break; } } for(int i1;im;i){ for(int j1;jn;j){ if(matrix[i][j]0){ matrix[0][j]0; matrix[i][0]0; } } } for(int i1;im;i){ for(int j1;jn;j){ if(matrix[0][j]0 || matrix[i][0]0){ matrix[i][j]0; } } } if(row){ for(int i0;in;i){ matrix[0][i]0; } } if(col){ for(int i0;im;i){ matrix[i][0]0; } } } }54. 螺旋矩阵 - 力扣LeetCode这个写错了不应该按照正方形的思路去做存在一种通用矩形方法定义四个角落的位置然后每次走完一个边界就修改边界注意后两次循环要加上判断条件因为前两次循环可能超边界了。上边取的是当前圈的top行这一行在当前圈里还没被取过。右边取的是当前圈的right列这一列在当前圈里还没被取过。下边取的是bottom行但单行时bottom top这一行已经被上边取过了。左边取的是left列但单列时left right这一列已经被右边取过了。class Solution { public ListInteger spiralOrder(int[][] matrix) { int mmatrix.length; int nmatrix[0].length; ArrayListInteger resnew ArrayList(); int top0, bottomm-1, left0, rightn-1; while(topbottom leftright){ for(int ileft;iright;i){ res.add(matrix[top][i]); } top; for(int itop;ibottom;i){ res.add(matrix[i][right]); } right--; if(topbottom){ for(int iright;ileft;i--){ res.add(matrix[bottom][i]); } bottom--; } if(leftright){ for(int ibottom;itop;i--){ res.add(matrix[i][left]); } left; } } return res; } }240. 搜索二维矩阵 II - 力扣LeetCode因为一个方向是最大值另一个方向是最小值。这样才能在每一步比较后确定唯一该往哪走从而排除一整行或一整列。class Solution { public boolean searchMatrix(int[][] matrix, int target) { int m matrix.length; int n matrix[0].length; int startrow0; int startcoln-1; while(startrowm startcol0){ if(matrix[startrow][startcol]target){ return true; }else if(matrix[startrow][startcol]target){ startcol--; }else{ startrow; } } return false; } }48. 旋转图像 - 力扣LeetCode常见的简单操作有转置(i, j) → (j, i)左右翻转(i, j) → (i, n - 1 - j)上下翻转(i, j) → (n - 1 - i, j)根据这三种操作改变本题是先转置下三角然后翻转一半的列class Solution { public void rotate(int[][] matrix) { // 147 // 258 // 369 int mmatrix.length; int nmatrix[0].length; for(int i0;im;i){ for(int j0;ji;j){ int temp matrix[i][j]; matrix[i][j]matrix[j][i]; matrix[j][i]temp; } } for(int i0;im;i){ for(int j0;jn/2;j){ int temp matrix[i][j]; matrix[i][j]matrix[i][n-j-1]; matrix[i][n-j-1]temp; } } } }