面试经典150题(29-31)

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

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

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

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

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

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. 螺旋矩阵)题目描述:

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

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

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. 旋转图像)题目描述:

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

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

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];
           }
       }
    }
}

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

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. 矩阵置零)题目描述:

给定一个 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]]

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

扫描二维码关注公众号,回复: 17316986 查看本文章
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 还能这样用!!)

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;
                }
            }
        }
    }
}

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

加油,早日跳槽!!!

猜你喜欢

转载自blog.csdn.net/weixin_44061648/article/details/135073647
今日推荐