矩阵

时间:2025-04-08 08:21:56

73.矩阵置零
思考:对于行和列分别用两个标记数组,遍历数组如果发现对应行列有0,则标记为true,再遍历一次将标记为true的行列元素全部置为0
记录:需要二刷

class Solution {
    public void setZeroes(int[][] matrix) {
        boolean[] row = new boolean[matrix.length];
        boolean[] col = new boolean[matrix[0].length];
        for(int i = 0;i < matrix.length;i++){
            for(int j = 0;j < matrix[0].length;j++){
                if(matrix[i][j] == 0){
                    row[i] = true;
                    col[j] = true;
                }
            }
        }
        for(int i = 0;i < matrix.length;i++){
            for(int j = 0;j < matrix[0].length;j++){
                if(row[i] || col[j]){
                    matrix[i][j] = 0;
                }
            }
        }
    }
}

54.螺旋矩阵
思考:四个角就是四个边界值,框住,依次遍历
记录:需要二刷

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int left = 0,right = matrix[0].length-1;
        int upper = 0,lower = matrix.length-1;
        List<Integer> res = new ArrayList<>();
        while(res.size() < matrix.length * matrix[0].length){
            if(upper <= lower){
                for(int i = left;i <= right;i++){
                    res.add(matrix[upper][i]);
                }
                upper++;
            }
            if(left <= right){
                for(int i = upper;i <= lower;i++){
                    res.add(matrix[i][right]);
                }
                right--;
            }
            if(upper <= lower){
                for(int i = right;i >= left;i--){
                    res.add(matrix[lower][i]);
                }
                lower--;
            }
            if(left <= right){
                for(int i = lower;i >= upper;i--){
                    res.add(matrix[i][left]);
                }
                left++;
            }
        }
        return res;
    }
}

48.旋转图像
思考:旋转90度,相当于先按对角线翻转,再依次行翻转,记住规律就行
记录:需要二刷

class Solution {
    public void rotate(int[][] matrix) {
        for(int i = 0;i < matrix.length;i++){
            for(int j = i;j < matrix[0].length;j++){
                int temp = matrix[i][j];
                matrix[i][j] = matrix[j][i];
                matrix[j][i] = temp;
            }
        }
        for(int[] num : matrix){
            reverse(num);
        }
    }
    void reverse(int[] num){
        int left = 0,right = num.length-1;
        while(left < right){
            int temp = num[left];
            num[left] = num[right];
            num[right] = temp;
            left++;
            right--;
        }
    }
}

240.搜索二维矩阵||
思考:跟二分查找的思路一样,要找到增加、减少的条件,二维把初始定位在右上角,这样向下就是增大,向左就是减少,就可以用二分查找了
记录:不需要二刷

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