跳转至

840. 矩阵中的幻方

这是六则或许对你有些许帮助的信息:

⭐️1、阿秀与朋友合作开发了一个编程资源网站,目前已经收录了很多不错的学习资源和黑科技(附带下载地址),如过你想要寻求合适的编程资源,欢迎体验以及推荐自己认为不错的资源,众人拾柴火焰高,我为人人,人人为我🔥!

2、👉23年5月份阿秀从字节跳动离职跳槽到某外企期间,为方便自己找工作,增加上岸几率,我自己从0开发了一个互联网中大厂面试真题解析网站,包括两个前端和一个后端。能够定向查看某些公司的某些岗位面试真题,比如我想查一下行业为互联网,公司为字节跳动,考察岗位为后端,考察时间为最近一年之类的面试题有哪些?

网站地址:InterviewGuide大厂面试真题解析网站。点此可以查看该网站的视频介绍:B站视频讲解 如果可以的话求个B站三连,感谢!

3、😊 分享一个阿秀自己私藏的黑科技网站点此直达,主要是各类小众实用APP、网站等,除此外也包括高清影视、音乐、电视剧、AI、纪录片、英语四六级考试、考研考公、副业等资源。

4、😍免费分享阿秀个人学习计算机以来收集到的免费学习资源,点此白嫖;也记录一下自己以前买过的不错的计算机书籍、网络专栏和垃圾付费专栏;也记录一下自己以前买过的不错的计算机书籍、网络专栏和垃圾付费专栏

5、🚀如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人踩过的坑留下的经验,事实上你现在遇到的大多数问题你的学长学姐师兄师姐基本都已经遇到过了。

6、🔥 欢迎准备计算机校招的小伙伴加入我的学习圈子,一个人踽踽独行不如一群人报团取暖,圈子里沉淀了很多过去21/22/23/24/25届学长学姐的经验和总结,好好跟着走下去的,最后基本都可以拿到不错的offer!如果你需要《阿秀的学习笔记》网站中📚︎校招八股文相关知识点的PDF版本的话,可以点此下载

840. 矩阵中的幻方

力扣原题链接(点我直达)

3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。

给定一个由整数组成的 grid,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。

示例:

Text Only
输入: [[4,3,8,4],
      [9,5,1,9],
      [2,7,6,2]]
输出: 1
解释: 
下面的子矩阵是一个 3 x 3 的幻方:
438
951
276

而这一个不是:
384
519
762

总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。

提示:

  1. 1 <= grid.length <= 10
  2. 1 <= grid[0].length <= 10
  3. 0 <= grid[i][j] <= 15

第一版,没意思,纯暴力法,就是比较麻烦

执行用时 :8 ms, 在所有 cpp 提交中击败了51.79%的用户

内存消耗 :9.4 MB, 在所有 cpp 提交中击败了19.05%的用户

C++
int equal(vector<int>& a, vector<int>& b, vector<int>& c) {

    //cout << a[0] << a[1] << a[2] << endl;
    //cout << b[0] << b[1] << b[2] << endl;
    //cout << c[0] << c[1] << c[2] << endl;

    unordered_set<int> res;
    for (auto& i : a) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 3) return 0;
    for (auto& i : b) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 6) return 0;
    for (auto& i : c) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 9) return 0;



    int sum = a[0] + a[1] + a[2];
    if (sum == b[0] + b[1] + b[2] && c[0] + c[1] + c[2] == sum) {//行
        if (a[0] + b[0] + c[0] == sum && a[1] + b[1] + c[1]== sum &&  a[2] + b[2] + c[2]==sum) {//列         
            if (a[0] + b[1]+c[2] ==sum&&b[1]+ a[2] + c[0] ==sum) //a0+b1+c2   a2+b1+c0
                return 1;
            else
                return 0;       
        }
        else
            return 0;
    }
    else
        return 0;
}


int numMagicSquaresInside(vector<vector<int>>& grid) {
    if (grid.size() < 3 || grid[0].size() < 3) return 0;
    int count = 0;
    vector<int> a, b, c;
    a.resize(3);
    b.resize(3);
    c.resize(3);
    int len1 = grid.size(), len2 = grid[0].size();//len1=3,len2=4
    for (int i = 0; i <= len1 - 3; ++i) {
        int j = 0;
        while (j <= len2 - 3) {


            a[0]=(grid[i][j + 0]);
            a[1] = (grid[i][j + 1]);
            a[2] = (grid[i][j + 2]);
            //cout << j << " ";
            b[0] = (grid[i+1][j + 0]);
            b[1] = (grid[i+1][j + 1]);
            b[2] = (grid[i+1][j + 2]);
            //cout << j << " ";
            c[0] = (grid[i + 2][j + 0]);
            c[1] = (grid[i + 2][j + 1]);
            c[2] = (grid[i + 2][j + 2]);
            //cout << j << " " << endl;
            count += equal(a, b, c);
            j++;
            //cout << j << " ";
            //cout << endl << "count " << count<<endl;

        }
        //cout << endl;
    }

    return count;

}

第二版,经过提示,改进一点

执行用时 :8 ms, 在所有 cpp 提交中击败了51.79%的用户

内存消耗 :8.9 MB, 在所有 cpp 提交中击败了78.57%的用户

中心点必须是5,且每行每列都需要是15才可以

C++
int equal(vector<int>& a, vector<int>& b, vector<int>& c) {

    //cout << a[0] << a[1] << a[2] << endl;
    //cout << b[0] << b[1] << b[2] << endl;
    //cout << c[0] << c[1] << c[2] << endl;

    unordered_set<int> res;
    for (auto& i : a) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 3) return 0;
    for (auto& i : b) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 6) return 0;
    for (auto& i : c) {
        if (i < 1 || i > 9) return 0;
        res.insert(i);
    }
    if (res.size() != 9) return 0;



    int sum = a[0] + a[1] + a[2]; //sum其实必须是15才可以
    if (sum == b[0] + b[1] + b[2] && c[0] + c[1] + c[2] == sum) {//行
        if (a[0] + b[0] + c[0] == sum && a[1] + b[1] + c[1]== sum &&  a[2] + b[2] + c[2]==sum) {//列         
            if (a[0] + b[1]+c[2] ==sum&&b[1]+ a[2] + c[0] ==sum) //a0+b1+c2   a2+b1+c0
                return 1;
            else
                return 0;       
        }
        else
            return 0;
    }
    else
        return 0;
}


int numMagicSquaresInside(vector<vector<int>>& grid) {
    if (grid.size() < 3 || grid[0].size() < 3) return 0;
    int count = 0;
    vector<int> a, b, c;
    a.resize(3);
    b.resize(3);
    c.resize(3);
    int len1 = grid.size(), len2 = grid[0].size();//len1=3,len2=4
    for (int i = 0; i <= len1 - 3; ++i) {
        int j = 0;
        while (j <= len2 - 3) {

            if (grid[i + 1][j + 1] != 5) { 
                j++;
                continue; 
            }

            a[0]=(grid[i][j + 0]);
            a[1] = (grid[i][j + 1]);
            a[2] = (grid[i][j + 2]);
            //cout << j << " ";
            b[0] = (grid[i+1][j + 0]);
            b[1] = (grid[i+1][j + 1]);
            b[2] = (grid[i+1][j + 2]);
            //cout << j << " ";
            c[0] = (grid[i + 2][j + 0]);
            c[1] = (grid[i + 2][j + 1]);
            c[2] = (grid[i + 2][j + 2]);
            //cout << j << " " << endl;
            count += equal(a, b, c);
            j++;
            //cout << j << " ";
            //cout << endl << "count " << count<<endl;

        }
        //cout << endl;
    }

    return count;

}