面试经典150题(29-31)

leetcode 150道题 计划花两个月时候刷完,今天(第十四天)完成了4道(29-32)150:

今天这是矩阵,真的全是模拟(我是菜狗。。),好恶心啊。

29.(有效的数独) 题目描述:

bash 复制代码
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

第一版(真的要看清除题,我之前没注意,以为输入的不一定是9×9的,后面判断小方块时候有点棘手,看了题目才发现是固定9×9的。。,我是纯模拟做的。)

java 复制代码
class Solution {
    public boolean isValidSudoku(char[][] board) {
        //数字 1-9 在每一行只能出现一次。
        int len=board.length;
        int[] key=new int[10];
        for(int i=0;i<len;i++){
            key=new int[10];
            for(int j=0;j<len;j++){
                int temp=board[i][j]-48;
                if(temp>=0&&temp<=9){
                    if(key[temp]!=0){
                        return false;
                    }
                    key[temp]++;
                }
            }
        }
        //数字 1-9 在每一列只能出现一次。
        for(int i=0;i<len;i++){
            key=new int[10];
            for(int j=0;j<len;j++){
                int temp=board[j][i]-48;
                if(temp>=0&&temp<=9){
                    if(key[temp]!=0){
                        return false;
                    }
                    key[temp]++;
                }
            }
        }
        //数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
         int count=0;
         key=new int[10];
         for(int index=0;index<3;index++){
            for(int i=0;i<len;i++){
                for(int j=index*3;j<index*3+3;j++){
                    int temp=board[i][j]-48;
                    if(temp>=0&&temp<=9){
                        if(key[temp]!=0){
                            return false;
                        }
                        key[temp]++;
                    }
                }
             if(i%3==2){
                 key=new int[10];
             }
            }
         }
        return true;
    }
}

30.(54. 螺旋矩阵)题目描述:

bash 复制代码
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [ 
[1,2,3],
[4,5,6],
[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

第一版(这个我还是稍微想了想,用了一点点想法,虽然还是模拟,但是我感觉我这个比解题的方法要好很多。。)

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int left=0;
        int right=0;
        int start=matrix.length-1;
        int end=matrix[0].length-1;
        List<Integer> spiralOrder=new ArrayList();
        while(left<=start&&right<=end){
            if(left==start&&right==end){
                spiralOrder.add(matrix[start][end]);
                break;
            }
            // 一行
            if(left==start){
                for(;right<=end;right++){
                    spiralOrder.add(matrix[left][right]);
                }
                break;
            }
            // 一列
            if(right==end){
                for(;left<=start;left++){
                    spiralOrder.add(matrix[left][right]);
                }
                break;
            }
            // 一圈-》一行 一列 一行 一列
            int temp=right;
            //一行
            for(;temp<=end;temp++){
                spiralOrder.add(matrix[left][temp]);
            }
            temp=left+1;
            //一列
            for(;temp<=start;temp++){
                spiralOrder.add(matrix[temp][end]);
            }
            temp=end-1;
            // 一行
            for(;temp>=right;temp--){
                spiralOrder.add(matrix[start][temp]);
            }
            //一列
            temp=start-1;
            for(;temp>left;temp--){
                spiralOrder.add(matrix[temp][right]);
            }
            left++;
            right++;
            start--;
            end--;
        }
        return spiralOrder;
    }
}

31.(48. 旋转图像)题目描述:

bash 复制代码
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

第一版(这个是真的没想到不额外用数组怎么调换位置,看看我菜鸡第一版)

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int len=matrix.length;
        int[][] res=new int[len][len];
        for(int i=0;i<len;i++){
            for(int j=0;j<len;j++){
                res[i][len-j-1]=matrix[j][i];
            }
        }
       for(int i=0;i<len;i++){
           for(int j=0;j<len;j++){
               matrix[i][j]=res[i][j];
           }
       }
    }
}

第二版(看了解题,真的太牛了还有公式。。但是就感觉最后一个先水平反转,再主对角线反转这个方法好)

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int len=matrix.length;
        //水平翻转
        for(int i=0;i<len/2;i++){
            for(int j=0;j<len;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[len-i-1][j];
                matrix[len-i-1][j]=temp;
            }
        }
        //主对角反转(/)  这个要好好理解,我反正一知半解
        for(int i=0;i<len;i++){
            for(int j=0;j<i;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }

    }
}

32.(73. 矩阵置零)题目描述:

bash 复制代码
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

第一版(这个我感觉不是很难。。但是写完发现别人的这个想法是真的牛)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int len=matrix.length;
        int with=matrix[0].length;
        Set<Integer> rowSet=new HashSet();
        Set<Integer> colSet=new HashSet();
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(matrix[i][j]==0){
                    rowSet.add(i);
                    colSet.add(j);
                }
            }
        }
        for(Integer row:rowSet){
            for(int j=0;j<with;j++){
                matrix[row][j]=0;
            }
        }
        for(Integer col:colSet){
            for(int i=0;i<len;i++){
                matrix[i][col]=0;
            }
        }
    }
}

第二版(来看看,大神的想法。。是真的佩服,boolean 还能这样用!!)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int len=matrix.length;
        int with=matrix[0].length;
        boolean[] rowSet=new boolean[len];
        boolean[] colSet=new boolean[with];
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(matrix[i][j]==0){
                    rowSet[i]=true;
                    colSet[j]=true;
                }
            }
        }
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(rowSet[i]||colSet[j]){
                    matrix[i][j]=0;
                }
            }
        }
    }
}

今天这些题太麻烦了,都需要找规律,但是还行能用笨办法写出来也是进步。

加油,早日跳槽!!!

相关推荐
南北是北北2 分钟前
JetPack WorkManager
面试
Swift社区3 分钟前
从 0 到 1 构建一个完整的 AGUI 前端项目的流程在 ESP32 上运行
前端·算法·职场和发展
RTC老炮7 分钟前
webrtc弱网-BitrateEstimator类源码分析与算法原理
网络·人工智能·算法·机器学习·webrtc
程序员烧烤10 分钟前
【leetcode刷题007】leetcode116、117
算法·leetcode
uhakadotcom1 小时前
在chrome浏览器插件之中,options.html和options.js常用来做什么事情
前端·javascript·面试
想想就想想1 小时前
线程池执行流程详解
面试
ghie90901 小时前
基于libsvm的支持向量机在MATLAB中的实现
算法·支持向量机·matlab
程序员清风2 小时前
Dubbo RPCContext存储一些通用数据,这个用手动清除吗?
java·后端·面试
南北是北北2 小时前
JetPack ViewBinding
面试
南北是北北2 小时前
jetpack ViewModel
面试