leetcode 1895. 最大的幻方 中等

一个 k x k幻方 指的是一个 k x k 填满整数的方格阵,且每一行、每一列以及两条对角线的和 全部 相等 。幻方中的整数 不需要互不相同 。显然,每个 1 x 1 的方格都是一个幻方。

给你一个 m x n 的整数矩阵 grid ,请你返回矩阵中 最大幻方尺寸 (即边长 k)。

示例 1:

复制代码
输入:grid = [[7,1,4,5,6],[2,5,1,6,4],[1,5,4,3,2],[1,2,7,3,4]]
输出:3
解释:最大幻方尺寸为 3 。
每一行,每一列以及两条对角线的和都等于 12 。
- 每一行的和:5+1+6 = 5+4+3 = 2+7+3 = 12
- 每一列的和:5+5+2 = 1+4+7 = 6+3+3 = 12
- 对角线的和:5+4+3 = 6+4+2 = 12

示例 2:

复制代码
输入:grid = [[5,1,3,1],[9,3,3,1],[1,3,3,8]]
输出:2

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 50
  • 1 <= grid[i][j] <= 10^6

分析:先求出水平、垂直、主对角线、反对角线的前缀和,再枚举幻方边长,遍历矩阵的每个点作为左上角点时幻方是否满足条件。

cpp 复制代码
int largestMagicSquare(int** grid, int gridSize, int* gridColSize) {
    int n=gridSize,m=gridColSize[0],ans=1;
    int sum_hor[n+5][m+5],sum_ver[n+5][m+5],sum_lr[n+5][m+5],sum_rl[n+5][m+5];
    for(int i=0;i<=n;++i)
        for(int j=0;j<=m;++j)
            sum_hor[i][j]=sum_ver[i][j]=sum_lr[i][j]=sum_rl[i][j]=0;

    for(int i=0;i<n;++i)
        for(int j=m-1;j>=0;--j)
            sum_hor[i][j]=grid[i][j]+sum_hor[i][j+1];
    for(int j=0;j<m;++j)
        for(int i=n-1;i>=0;--i)
            sum_ver[i][j]=grid[i][j]+sum_ver[i+1][j];
    for(int i=n-1;i>=0;--i)
        for(int j=m-1;j>=0;--j)
            sum_lr[i][j]=grid[i][j]+sum_lr[i+1][j+1];
    for(int i=n-1;i>=0;--i)
        for(int j=0;j<m;++j)
        {
            sum_rl[i][j]=grid[i][j];
            if(j)sum_rl[i][j]+=sum_rl[i+1][j-1];
        }
    
    int maxn=fmin(n,m);
    for(int l=1;l<maxn;++l)
    {
        for(int i=0;i<n-l;++i)
        {
            for(int j=0;j<m-l;++j)
            {
                int temp=sum_lr[i][j]-sum_lr[i+l+1][j+l+1],f1=0;
                if(j-1>=0)
                {
                    if(sum_rl[i][j+l]-sum_rl[i+l+1][j-1]==temp)f1=1;
                }
                else if(sum_rl[i][j+l]==temp)f1=1;

                for(int k=0;k<=l&&f1;++k)
                {
                    if(sum_hor[i+k][j]-sum_hor[i+k][j+l+1]!=temp)f1=0;
                    if(sum_ver[i][j+k]-sum_ver[i+l+1][j+k]!=temp)f1=0;
                }
                if(f1)ans=fmax(ans,l+1);
            }
        }
    }
    
    return ans;
}
相关推荐
Charlie_lll1 小时前
力扣解题-移动零
后端·算法·leetcode
iAkuya2 小时前
(leetcode)力扣100 62N皇后问题 (普通回溯(使用set存储),位运算回溯)
算法·leetcode·职场和发展
YuTaoShao7 小时前
【LeetCode 每日一题】3634. 使数组平衡的最少移除数目——(解法一)排序+滑动窗口
算法·leetcode·排序算法
TracyCoder1239 小时前
LeetCode Hot100(27/100)——94. 二叉树的中序遍历
算法·leetcode
草履虫建模16 小时前
力扣算法 1768. 交替合并字符串
java·开发语言·算法·leetcode·职场和发展·idea·基础
VT.馒头20 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
不穿格子的程序员1 天前
从零开始写算法——普通数组篇:缺失的第一个正数
算法·leetcode·哈希算法
VT.馒头1 天前
【力扣】2722. 根据 ID 合并两个数组
javascript·算法·leetcode·职场和发展·typescript
执着2591 天前
力扣hot100 - 108、将有序数组转换为二叉搜索树
算法·leetcode·职场和发展
52Hz1181 天前
力扣230.二叉搜索树中第k小的元素、199.二叉树的右视图、114.二叉树展开为链表
python·算法·leetcode