(LeetCode 每日一题) 498. 对角线遍历 (矩阵、模拟)

题目:498. 对角线遍历

思路:矩阵模拟,时间复杂度0(nm)。
按对角线遍历,而每条对角线都是i+j=k,k的范围为[0,n-1+m-1]。

C++版本:

cpp 复制代码
class Solution {
public:
    vector<int> findDiagonalOrder(vector<vector<int>>& mat) {
        int n=mat.size(),m=mat[0].size();
        vector<int> ans;
        // i+j=k  -> j=k-i;
        for(int k=0;k<n+m-1;k++){
        	//枚举j的值,那需要求出j可达的最小值和最大值
        	//当i=n-1时,j的值最小,但不能小于0
            int mn=max(k-(n-1),0);
            //当i=0时,j的值最大,但不能大于m-1
            int mx=min(k-0,m-1);
            if(k%2==0){
                for(int j=mn;j<=mx;j++){
                    ans.push_back(mat[k-j][j]);
                }
            }else{
                for(int j=mx;j>=mn;j--){
                    ans.push_back(mat[k-j][j]);
                }
            }
        }
        return ans;
    }
};

JAVA版本:

java 复制代码
class Solution {
    public int[] findDiagonalOrder(int[][] mat) {
        int n=mat.length,m=mat[0].length;
        int[] ans=new int[n*m];
        int idx=0;
        // i+j=k  -> j=k-i;
        for(int k=0;k<n+m-1;k++){
            int mn=Math.max(k-(n-1),0);
            int mx=Math.min(k-0,m-1);
            if(k%2==0){
                for(int j=mn;j<=mx;j++){
                    ans[idx++]=mat[k-j][j];
                }
            }else{
                for(int j=mx;j>=mn;j--){
                    ans[idx++]=mat[k-j][j];
                }
            }
        }
        return ans;
    }
}

GO版本:

go 复制代码
func findDiagonalOrder(mat [][]int) []int {
    n,m:=len(mat),len(mat[0])
    ans:=make([]int,n*m)
    idx:=0
    // i+j=k  -> j=k-i;
    for k:=0;k<n+m-1;k++ {
        mn:=max(k-(n-1),0)
        mx:=min(k-0,m-1)
        if k%2==0 {
            for j:=mn;j<=mx;j++ {
                ans[idx]=mat[k-j][j]
                idx++
            }
        }else{
            for j:=mx;j>=mn;j-- {
                ans[idx]=mat[k-j][j]
                idx++
            }
        }
    }
    return ans
}
相关推荐
二哈赛车手1 小时前
新人笔记---ApiFox的一些常见使用出错
java·笔记·spring
吃好睡好便好1 小时前
在Matlab中绘制横直方图
开发语言·学习·算法·matlab
栗子~~1 小时前
JAVA - 二层缓存设计(本地缓冲+redis缓冲+广播所有本地缓冲失效) demo
java·redis·缓存
YDS8292 小时前
DeepSeek RAG&MCP + Agent智能体项目 —— RAG知识库的搭建和接口实现
java·ai·springboot·agent·rag·deepseek
仰泳之鹅2 小时前
【C语言】自定义数据类型2——联合体与枚举
c语言·开发语言·算法
未若君雅裁3 小时前
MyBatis 一级缓存、二级缓存与清理机制
java·缓存·mybatis
2601_957787583 小时前
矩阵运营的技术底座:为什么“一体化系统“正在取代“工具拼装“
人工智能·矩阵·矩阵运营
于小猿Sup3 小时前
VMware在Ubuntu22.04驱动Livox Mid360s
linux·c++·嵌入式硬件·自动驾驶
AI人工智能+电脑小能手3 小时前
【大白话说Java面试题 第65题】【JVM篇】第25题:谈谈对 OOM 的认识
java·开发语言·jvm
阿维的博客日记4 小时前
Nacos 为什么能让配置动态生效?(涉及 @RefreshScope 注解)
java·spring