Leetcode(二维数组)

这篇博客介绍了矩阵的旋转和特殊元素处理方法。包括如何将二维矩阵顺时针旋转90度,以及当矩阵中某元素为0时,如何将对应行和列设为0。此外,还讨论了对角线遍历矩阵的算法,虽然最初的实现仅适用于方阵,但后续给出了更通用的解决方案。
摘要由CSDN通过智能技术生成


二维数组

48. 旋转图像

48. 旋转图像

将一个二维矩阵顺时针旋转90°

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]
123					741
456   ---->  		852
789					963
class Solution {
    public void rotate(int[][] matrix) {
        int n=matrix.length;
        int[][] matrixs=new int[n][n];

        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n; j ++){
                matrixs[i][j]=matrix[n-1-j][i];
            }
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < n; j ++){
                matrix[i][j]=matrixs[i][j];
            }
        }
    }
}

总结

顺时针旋转90°matrixs[i][j]=matrix[n-1-j][i];
逆时针旋转90°matrixs[i][j]=matrix[j][n-1-i];

画图理解
在这里插入图片描述

面试题 01.08. 零矩阵

面试题 01.08. 零矩阵

二维矩阵如果某个元素为0,该行该列都改为0
输入:
[
  [1,1,1],
  [1,0,1],
  [1,1,1]
]
输出:
[
  [1,0,1],
  [0,0,0],
  [1,0,1]
]
class Solution {
    public void setZeroes(int[][] matrix) {
        int n = matrix.length;
        int[] row = new int[n];
        int[] colum = new int[matrix[0].length];
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < matrix[0].length; j ++){
                if(matrix[i][j]==0){
                    row[i]=1;
                    colum[j]=1;
                }
            }
        }
        for(int i = 0; i < n; i ++){
            for(int j = 0; j < matrix[0].length; j ++){
                if(row[i]==1||colum[j]==1){
                    matrix[i][j]=0;
                }
            }
        }
    }
}

总结

注意利用bool值来记录某些特别的规则

498. 对角线遍历

498. 对角线遍历
边界题感觉
先说思路
(第一次思路)
在这里插入图片描述

我首先想到模拟的特殊情况(也就是溢出的情况)紧接着分为两部分,这里图我是把特殊边界单独处理放在while外

但是该代码 只适用方阵(本来打算改进为一般矩阵,但是代码太臭了,还是放弃吧-.-···

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int n=mat.length;
        int m=mat[0].length;
        int[] ans = new int[m*n];
        ans[0]=mat[0][0];
        int row=0,colum=1,index=1;
        for(int i = 1; i < n; i ++){
            if(row==0){
                while(colum!=0){
                    ans[index]=mat[row][colum];
                    index++;
                    row++;
                    colum--;
                }
                ans[index]=mat[row][colum];
                index++;
                row++;
            }
            else if(colum==0){
                while(row!=0){
                    ans[index]=mat[row][colum];
                    index++;
                    row--;
                    colum++;
                }
                ans[index]=mat[row][colum];
                index++;
                colum++;
            }
            else if(row>=n||colum>=n){
                break;
            }
        }
        if(row>=n){
            row--;
            colum++;
        }
        if(colum>=n){
            row++;
            colum--;
        }
        for(int i = 1; i < m; i ++){
            if(row==(n-1)){
                while(colum!=(m-1)){
                    ans[index]=mat[row][colum];
                    row--;
                    index++;
                    colum++;
                }
                ans[index]=mat[row][colum];
                index++;
                row++;
            }
            else if(colum==(m-1)){
                while(row!=(n-1)){
                    ans[index]=mat[row][colum];
                    row++;
                    colum--;
                    index++;
                }
                ans[index]=mat[row][colum];
                index++;
                colum++;
            }
            if(row==(n-1)&&colum==(n-1)){
                ans[index]=mat[n-1][m-1];
                break;
            }
        }
        return ans;
    }
}

大佬题解
第二次思路:
先分向上和向下两种排序,用%2来达成不同while,第一次的思路是分两半从对角线开始分析
在这里插入图片描述
(这里我发现矩阵分长矩阵和宽矩阵,以为我的适合于长矩阵,因为我的判断条件第二部分为是否为最后一行或者最后一列,结果还是不对)

class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        if(mat.length==0)return new int[0];
        int m=mat.length;
        int n=mat[0].length;
        int count=m+n-1;
        int[] answer=new int[m*n];
        int row=0;
        int colum=0;
        int index=0;
        for(int i = 0; i < count; i ++){
            if(i%2==0){
            while(row>=0&&colum<n){
                answer[index]=mat[row][colum];
                index++;
                row--;
                colum++;
            }
            if(colum>=n){
                    row=row+2;
                    colum--;
                }
                else{
                    row++;
                }
            }
            else{
            while(row<m&&colum>=0){
                answer[index]=mat[row][colum];
                index++;
                row++;
                colum--;
            }
                if(row>=m){
                    colum=colum+2;
                    row--;
                }
                else{
                    colum++;
                }
            }
        }
        return answer;
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
回答: 递归求解二维数组路径可以使用暴力递归的方式。思路是,对于二维数组中的每一个点,记录其到终点(右下角点)的最小路径和。具体做法是,分别查看该点的正下方和右边两个点的值,选择其中较小的一个与数组原位置的值相加。最终,数组左上角位置的值即为问题的解。\[1\] #### 引用[.reference_title] - *1* [二维数组从左上到右下,返回最小路径和问题的解法](https://blog.csdn.net/z1171127310/article/details/127716640)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [LeetCode题目总结——二维数组](https://blog.csdn.net/weixin_40131652/article/details/108680706)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [二维数组的最小路径和问题](https://blog.csdn.net/hotonyhui/article/details/126962888)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值