矩阵置零

class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        boolean[] row = new boolean[m];//选出要全置为0的行
        boolean[] col = new boolean[n];//选出要全置为0的列
        for(int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(matrix[i][j] == 0){
                    //对原矩阵遍历,确定需要置0的行和列
                    row[i]=col[j]=true;
                }
            }
        }
        for (int i = 0;i < m;i++){
            for(int j = 0;j < n;j++){
                if(row[i] || col[j]){
                    matrix[i][j]=0;
                }
            }
        }
    }
}

螺旋矩阵

下次看一看怎么直接用list

l和1太像了,下次换了

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if(matrix.length == 0)return new LinkedList<>();
        int l = 0;
        int r = matrix[0].length-1;
        int t = 0;
        int b = matrix.length-1;
        int x = 0;
        Integer[] res = new Integer[(r+1)*(b+1)];
        while (true){
            //从左到右遍历
            for(int i = l;i <= r;i++)res[x++] = matrix[t][i];//这里的matrix[][]也要注意
            //看下一个遍历是从下到上,判断结束的条件就是有没有下一个。
            if(++t > b)break;
            for(int i = t; i <= b;i++)res[x++] = matrix[i][r];
            if(--r < l)break;
            for(int i = r;i >= l;i--)res[x++] = matrix[b][i];
            if(--b < t)break;
            for(int i = b;i >= t;i--)res[x++] = matrix[i][l];
            if(++l > r)break;;
        }
        return Arrays.asList(res);
    }
}

旋转图像

关键

matrix[i] [j] → matrix[j] [n−1−i]
原索引位置 → 旋转后索引位置

这个更好理解

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = tmp;
            }
        }
    }
}

搜索二维矩阵

过于简单了

class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int i = matrix.length-1;
        int j = 0;
        while (i >= 0 && j < matrix[0].length){
            if(target > matrix[i][j]){
                j++;
            }else if(target < matrix[i][j]){
                i--;
            }else {
                return true;
            }
        }
        return false;
    }
}

比较是偷走幸福的小偷