春招冲刺百题计划|矩阵

Java基础复习

  1. Java数组的声明与初始化
  2. Java ArrayList
  3. Java HashMap

第一题:螺旋矩阵(多复习,谨记这不是子问题,而是走到不能再走才结束这个方向)

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        //学一下大神的简洁代码,作者:Rikka
        List<Integer> ans = new ArrayList<>();
        //能够直接给出答案(走不了)的情况
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return ans;

        int u = 0, d = matrix.length - 1;
        int l = 0, r = matrix[0].length - 1;

        while (true) {
            for (int i = l; i <= r; i++) { // 左->右
                ans.add(matrix[u][i]);
            }
            //没有可走的行了
            if (++u > d) break;
            for (int i = u; i <= d; i++) { // 上->下
                ans.add(matrix[i][r]);
            }
            //没有可走的列了
            if (--r < l) break;
            for (int i = r; i >= l; i--) { // 右->左
                ans.add(matrix[d][i]);
            }
            if (--d < u) break;
            for (int i = d; i >= u; i--) { // 下->上
                ans.add(matrix[i][l]);
            }
            if (++l > r) break;
        }
        return ans;
    }
}

第二题:生命游戏(增加状态实现在原始矩阵上进行操作,位运算的妙处)

java 复制代码
class Solution {
    public void gameOfLife(int[][] board) {
        //在原地处理的思路:拓展状态(原来的活细胞现在死了,原来的死细胞现在活了)(有大神直接利用位运算来处理状态的记录,
        //相当于将这个board拓展成了多维数组,真的太强了,作者:自在飞花)
        if(board.length==0||board[0].length==0){
            return;
        }
        int rows[] = {-1, -1, -1, 0, 0, 1, 1, 1};
        int cols[] = {-1, 0, 1, -1, 1, -1, 0, 1};
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board[0].length; j++){
                
                int sum=0;
                for(int k=0; k<rows.length; k++){

                    if(i+rows[k]>=0&&i+rows[k]<board.length&&j+cols[k]>=0&&j+cols[k]<board[0].length){
                        sum += board[i+rows[k]][j+cols[k]]&1;
                    }
                }
                if(board[i][j]==1){
                    if(sum==2||sum==3)
                        board[i][j] |= 2;
                }else{
                    if(sum==3)
                        board[i][j] |= 2;
                }
            }

        }
        for(int i=0; i<board.length; i++){
            for(int j=0; j<board[0].length; j++){
                board[i][j] >>= 1; //右移一位,用第二bit覆盖第一个bit。
            }
        }




        
    }
    //很简单的模拟。不能再原地处理,但是题目希望你在原地处理。
        // if(board.length==0||board[0].length==0){
        //     return;
        // }
        // int rows[] = {-1, -1, -1, 0, 0, 1, 1, 1};
        // int cols[] = {-1, 0, 1, -1, 1, -1, 0, 1};
        // int newBoard[][] = new int[board.length][board[0].length];
        // for(int i=0; i<board.length; i++){
        //     for(int j=0; j<board[0].length; j++){
        //         newBoard[i][j] = board[i][j];
        //     }
        // }
        // for(int i=0; i<board.length; i++){
        //     for(int j=0; j<board[0].length; j++){
                
        //         int sum=0;
        //         for(int k=0; k<rows.length; k++){

        //             if(i+rows[k]>=0&&i+rows[k]<board.length&&j+cols[k]>=0&&j+cols[k]<board[0].length){
        //                 sum += newBoard[i+rows[k]][j+cols[k]];
        //             }
        //         }
        //         if(newBoard[i][j]==0&&sum==3){
        //             board[i][j] = 1;
        //         }
        //         if(newBoard[i][j]==1&&sum<2){
        //             board[i][j] = 0;
        //         }
        //         if(newBoard[i][j]==1&&(sum==3||sum==2)){
        //             board[i][j] = 1;
        //         }
        //         if(newBoard[i][j]==1&&sum>3){
        //             board[i][j] = 0;
        //         }
        //     }
        // }

}

第三题:旋转图像(越简单的要求越要命呀)

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        //自己想不出来,还是用的leetcode官方给出的解题思路,觉得自己好垃圾哦,根本就是一个垃圾。
        //创建辅助数组
        //遍历原来的数组,赋值条件【newMatrix[col][n−row−1]=matrix[row][col]】
        int[][] newMatrix = new int[matrix.length][matrix[0].length];
        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                newMatrix[j][matrix[0].length-i-1] = matrix[i][j];
            }
        }
        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                matrix[i][j] = newMatrix[i][j];
            }
        }
        //如果需要原地实现的话,需要比较复杂的推导过程,最后得到一个循环的公式,实现1的控件复杂度。
    }
}

第四题:矩阵置零

非常粗暴的用map记录下来。

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        //感觉可以用增加状态的方法写:不行哦,因为并不是0-1
        //那我应该怎么办?其实原地最大的问题是要区分原来的0和后来设置的0。
        //我可不可以记录行号和列号,利用map。
        Map<Integer, Integer> rows = new HashMap<>();
        Map<Integer, Integer> cols = new HashMap<>();
        rows.clear();
        cols.clear();
        for(int i=0; i<matrix.length; i++){
            for(int j=0; j<matrix[0].length; j++){
                if(matrix[i][j]==0){
                    if(!rows.containsKey(i)){
                        rows.put(i, 1);
                    }
                    if(!cols.containsKey(j)){
                        cols.put(j, 1);
                    }
                }
            }
        }
        System.out.println(rows);
        System.out.println(cols);
        for (Integer i : rows.keySet()) {
            for(int j=0; j<matrix[0].length; j++){
                
                matrix[i][j]=0;
            }
        }
        for (Integer j : cols.keySet()) {
            for(int i=0; i<matrix.length; i++){
                matrix[i][j]=0;
            }
        }
    }
}

我这样做和重新搞一个矩阵没什么区别。

题解的方法,在空间优化上是使用了原本矩阵的第0行和第0列作为标记数组。

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int m = matrix.length, n = matrix[0].length;
        boolean flagCol0 = false, flagRow0 = false;
        for (int i = 0; i < m; i++) {
            if (matrix[i][0] == 0) {
                flagCol0 = true;
            }
        }
        for (int j = 0; j < n; j++) {
            if (matrix[0][j] == 0) {
                flagRow0 = true;
            }
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                if (matrix[i][j] == 0) {
                    matrix[i][0] = matrix[0][j] = 0;
                }
            }
        }
        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;
                }
            }
        }
        if (flagCol0) {
            for (int i = 0; i < m; i++) {
                matrix[i][0] = 0;
            }
        }
        if (flagRow0) {
            for (int j = 0; j < n; j++) {
                matrix[0][j] = 0;
            }
        }
    }
}

作者:力扣官方题解
链接:https://leetcode.cn/problems/set-matrix-zeroes/solutions/669901/ju-zhen-zhi-ling-by-leetcode-solution-9ll7/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
阿史大杯茶38 分钟前
Codeforces Round 976 (Div. 2 ABCDE题)视频讲解
数据结构·c++·算法
LluckyYH1 小时前
代码随想录Day 58|拓扑排序、dijkstra算法精讲,题目:软件构建、参加科学大会
算法·深度优先·动态规划·软件构建·图论·dfs
转调1 小时前
每日一练:地下城游戏
开发语言·c++·算法·leetcode
不穿格子衬衫2 小时前
常用排序算法(下)
c语言·开发语言·数据结构·算法·排序算法·八大排序
wdxylb2 小时前
使用C++的OpenSSL 库实现 AES 加密和解密文件
开发语言·c++·算法
aqua35357423582 小时前
蓝桥杯-财务管理
java·c语言·数据结构·算法
CV金科2 小时前
蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)
stm32·单片机·嵌入式硬件·算法·蓝桥杯
sewinger2 小时前
区间合并算法详解
算法
XY.散人2 小时前
初识算法 · 滑动窗口(1)
算法
韬. .3 小时前
树和二叉树知识点大全及相关题目练习【数据结构】
数据结构·学习·算法