前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2023-11-15:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那么称这个正方形矩阵叫做神奇矩

2023-11-15:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像, 那么称这个正方形矩阵叫做神奇矩

作者头像
福大大架构师每日一题
发布2023-11-16 10:37:21
2510
发布2023-11-16 10:37:21
举报
文章被收录于专栏:福大大架构师每日一题

2023-11-15:用go语言,如果一个正方形矩阵上下对称并且左右对称,对称的意思是互为镜像,

那么称这个正方形矩阵叫做神奇矩阵,

比如 :

1 5 5 1

6 3 3 6

6 3 3 6

1 5 5 1

这个正方形矩阵就是神奇矩阵。

给定一个大矩阵n*m,返回其中神奇矩阵的数目。

1 <= n,m <= 1000。

来自左程云。

答案2023-11-15:

go代码用灵捷3.5编写。

大体过程如下:

1.定义常量MAXN为1001,定义常量baser为491,定义常量basec为499。

2.定义数组powr和powc,分别计算baser和basec的幂次,用于后续计算哈希值。

3.定义数组arr1、arr2、arr3,分别存储原数组、上下对称数组、左右对称数组。

4.定义数组sum1、sum2、sum3,分别存储三个数组的前缀哈希和。

5.通过循环读取输入的n、m和矩阵元素,并顺便把元素存入arr1、arr2、arr3对应位置。

6.构建arr1、arr2、arr3的前缀哈希和,存入sum1、sum2、sum3中。

7.定义函数hash,用于计算矩阵中(a,b)到(c,d)范围内的哈希值。

8.定义函数ok,用于判断以(a,b)到(c,d)范围内的正方形是否为神奇矩阵。

9.定义函数number,用于统计大矩阵中神奇矩阵的数量。分别计算奇数长度和偶数长度的正方形数量,返回总数量。

10.在主函数中调用上述各个函数,输出最终结果。

11.总时间复杂度为O(n^2 * logn),总额外空间复杂度为O(n^2)

go完整代码如下:

代码语言:javascript
复制
package main

import (
    "fmt"
)

const MAXN int = 1001
const baser int = 491
const basec int = 499

var powr [MAXN]int64
var powc [MAXN]int64
var arr1 [MAXN][MAXN]int
var arr2 [MAXN][MAXN]int
var arr3 [MAXN][MAXN]int
var sum1 [MAXN][MAXN]int64
var sum2 [MAXN][MAXN]int64
var sum3 [MAXN][MAXN]int64
var n int
var m int

func init() {
    powr[0] = 1
    powc[0] = 1
    for i := 1; i < MAXN; i++ {
        powr[i] = powr[i-1] * int64(baser)
    }
    for i := 1; i < MAXN; i++ {
        powc[i] = powc[i-1] * int64(basec)
    }
}

func buildHash(arr *[MAXN][MAXN]int, sum *[MAXN][MAXN]int64) {
    for i := 1; i <= n; i++ {
        for j := 1; j <= m; j++ {
            sum[i][j] = sum[i][j-1]*int64(basec) + int64(arr[i][j])
        }
    }
    for i := 1; i <= n; i++ {
        for j := 1; j <= m; j++ {
            sum[i][j] += sum[i-1][j] * int64(baser)
        }
    }
}

func hash(sum *[MAXN][MAXN]int64, a int, b int, c int, d int) int64 {
    ans := sum[c][d] - sum[a-1][d]*powr[c-a+1] - sum[c][b-1]*powc[d-b+1] + sum[a-1][b-1]*powr[d-b+1]*powc[c-a+1]
    return ans
}

func number() int {
    ans := 0
    // 奇数长度,实点做中心
    for i := 1; i <= n; i++ {
        for j := 1; j <= m; j++ {
            l := 1
            r := min(min(i, n-i+1), min(j, m-j+1))
            find := 1
            var m int
            for l <= r {
                m = (l + r) / 2
                if ok(i-m+1, j-m+1, i+m-1, j+m-1) {
                    find = m
                    l = m + 1
                } else {
                    r = m - 1
                }
            }
            ans += find
        }
    }
    // 偶数长度
    // 虚点做中心
    for i := 1; i < n; i++ {
        for j := 1; j < m; j++ {
            // 左上角点为代表
            l := 1
            r := min(min(i, j), min(n-i, m-j))
            find := 0
            var m int
            for l <= r {
                m = (l + r) / 2
                if ok(i-m+1, j-m+1, i+m, j+m) {
                    find = m
                    l = m + 1
                } else {
                    r = m - 1
                }
            }
            ans += find
        }
    }
    return ans
}

func ok(a int, b int, c int, d int) bool {
    if a == c {
        return true
    }
    h1 := hash(&sum1, a, b, c, d)
    h2 := hash(&sum2, n-c+1, b, n-a+1, d)
    h3 := hash(&sum3, a, m-d+1, c, m-b+1)
    return h1 == h2 && h1 == h3
}

func min(x int, y int) int {
    if x < y {
        return x
    }
    return y
}

func main() {
    inputs := []int{5, 5,
        4, 2, 4, 4, 4,
        3, 1, 4, 4, 3,
        3, 5, 3, 3, 3,
        3, 1, 5, 3, 3,
        4, 2, 1, 2, 4}
    ii := 0

    n = inputs[ii]
    ii++
    m = inputs[ii]
    ii++
    for i := 1; i <= n; i++ {
        for j := 1; j <= m; j++ {
            arr1[i][j] = inputs[ii]
            ii++
            arr2[n-i+1][j] = arr1[i][j]
            arr3[i][m-j+1] = arr1[i][j]
        }
    }
    buildHash(&arr1, &sum1)
    buildHash(&arr2, &sum2)
    buildHash(&arr3, &sum3)
    fmt.Println(number())

}

在这里插入图片描述

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-11-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 大体过程如下:
  • go完整代码如下:
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档