这是悦乐书的第326次更新,第349篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第196题(顺位题号是840)。3 x 3魔方是一个3 x 3网格,填充了从1到9的不同数字,这样每行,每列和两个对角线都具有相同的总和。

给定一个整数网格,求有多少个3 x 3“魔方”子网格? (每个子网格都是连续的)。例如:



输入:[[4,3,8,4],[9,5,1,9],[2,7,6,2]]

输出:1

说明:

以下子网格是一个3 x 3魔方:

4 3 8

9 5 1

2 7 6

而这一个不是:

3 8 4

5 1 9

7 6 2

所以,给定网格中只有一个魔方。



注意

  • 1 <= grid.length <= 10

  • 1 <= grid [0] .length <= 10

  • 0 <= grid [i] [j] <= 15

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 解题

题目的意思很明确,需要我们从给定的二维数组中找出符合题意的3x3魔方,而一个合格的3x3魔方需要满足以下条件:

(1)每行、每列、两条对角线上的元素之和相等。

(2)每个元素的取值范围为:[1,9]。

(3)魔方中的任意元素不能出现重复值,即为1到9的随机排列。

因此,解题思路就是将截取出一个子数组,分别取出9个元素,判断是否满足上述三个条件即可。在判断是否有重复值出现时,使用了异或位运算,因为两个相同的数进行异或运算的结果是0,同时使用异或运算也判断了元素的取值范围,一举两得。

public int numMagicSquaresInside(int[][] grid) {
int row = grid.length, col = grid[0].length;
if (row < 2 || col < 2) {
return 0;
}
int count = 0;
for (int i=0; i<row-2; i++) {
for (int j=0; j<col-2; j++) {
int n = grid[i][j], n2 = grid[i][j+1], n3 = grid[i][j+2];
int n4 = grid[i+1][j], n5 = grid[i+1][j+1], n6 = grid[i+1][j+2];
int n7 = grid[i+2][j], n8 = grid[i+2][j+1], n9 = grid[i+2][j+2];
// 1 <= grid[i][j] <= 9,且不能出现重复值
if ((n^n2^n3^n4^n5^n6^n7^n8^n9) != (1^2^3^4^5^6^7^8^9)) {
continue;
}
// 三行三列外加两对角线,判断和
int sum = n+n2+n3;
int sum2 = n4+n5+n6;
int sum3 = n7+n8+n9;
int sum4 = n+n4+n7;
int sum5 = n2+n5+n8;
int sum6 = n3+n6+n9;
int sum7 = n+n5+n9;
int sum8 = n3+n5+n7;
if (sum == sum2 && sum2 == sum3 && sum3 == sum4
&& sum4 == sum5 && sum5 == sum6 && sum6 == sum7
&& sum7 == sum8) {
count++;
}
}
}
return count;
}

03 小结

算法专题目前已日更超过五个月,算法题文章196+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Magic Squares In Grid(Java实现)的更多相关文章

  1. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  2. LeetCode算法题-Letter Case Permutation(Java实现)

    这是悦乐书的第315次更新,第336篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第184题(顺位题号是784).给定一个字符串S,将每个字母单独转换为小写或大写以创建另 ...

  3. LeetCode算法题-Jewels and Stones(Java实现)

    这是悦乐书的第313次更新,第334篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第182题(顺位题号是771).字符串J代表珠宝,S代表你拥有的石头.S中的每个字符都是 ...

  4. LeetCode算法题-Reach a Number(Java实现)

    这是悦乐书的第310次更新,第331篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第179题(顺位题号是754).你站在无限数字线的0号位置.在目的地有个target.在 ...

  5. LeetCode算法题-Shortest Completing Word(Java实现)

    这是悦乐书的第309次更新,第330篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第178题(顺位题号是748).从给定的字典单词中查找最小长度单词,其中包含字符串lic ...

  6. LeetCode算法题-Self Dividing Numbers(Java实现)

    这是悦乐书的第305次更新,第324篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是728).自分割数是一个可被其包含的每个数字整除的数字.例如,12 ...

  7. LeetCode算法题-Find Pivot Index(Java实现)

    这是悦乐书的第304次更新,第323篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第172题(顺位题号是724).给定一个整数nums数组,编写一个返回此数组的" ...

  8. LeetCode算法题-To Lower Case(Java实现)

    这是悦乐书的第301次更新,第320篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第169题(顺位题号是709).实现具有字符串参数str的函数ToLowerCase() ...

  9. LeetCode算法题-Count Binary Substrings(Java实现)

    这是悦乐书的第293次更新,第311篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第161题(顺位题号是696).给定一个字符串s,计算具有相同数字0和1的非空且连续子串 ...

随机推荐

  1. robotframework调用外部python多次运行拿到的都是同一个值

    外部python是一个爬虫,爬取的内容的定义没有放入函数中.导致一次爬取多次使用的情况出现. 第一版函数如下: 改版后:

  2. P1086 花生采摘题解

    这道题只是普通的模拟,不是贪心! 重点在于这句话:“然后再找出剩下的植株里花生最多的,去采摘它的花生”. 也就是,你下一个必须找到剩下花生最多的,而不是按照贪心思想来考虑在限定时间内的最优解 那么,应 ...

  3. C++线程同步 -- windows

    简介: 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程.但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入, 由于CPU时间调度上的问题,写入 ...

  4. 批处理实现自动Git push

    用Git用的多,每次修改文件后都需要敲几条命令: git add git commit git push ······ 太麻烦了 于是想到使用批处理(.bat)来自动化这个过程(注意:Windows环 ...

  5. dubbo网关

    https://blog.csdn.net/Paranoia_ZK/article/details/90743432 springcloud 和 dubbo 混用

  6. Modbus软件开发实战指南 之 开发自己的Modbus Poll工具 - 3

    Modbus-RTU 一.数据分析       两个设备(单片机)通讯,用的是Modbus协议.      在单片机中拿出一部分内存(RAM)进行两个设备通讯,例如: 说明: OX[20]   代表是 ...

  7. 解决JavaServer Faces 2.2 requires Dynamic Web Module 2.5 or newer问题

    ** 错误1: **在eclipse中新创建一个web项目的时候项目下的JSP文件中会爆出错误:The superclass “javax.servlet.http.HttpServlet” was ...

  8. C# 更改 Hashtable key 名称

    Hashtable ht = new Hashtable(); ht[; ht["B"] = ht["标题"]; ht.Remove("标题" ...

  9. spring自定义注解实现登陆拦截器

    1.spring自定义注解实现登陆拦截器 原理:定义一个注解和一个拦截器,拦截器拦截所有方法请求,判断该方法有没有该注解.没有,放行:有,要进行验证.从而实现方法加注解就需要验证是否登陆. 2.自定义 ...

  10. Python抽象类(abc模块)

    1.抽象类概念 抽象类是一个特殊的类,只能被继承,不能实例化 2.为什么要有抽象类 其实在未接触抽象类概念时,我们可以构造香蕉.苹果.梨之类的类,然后让它们继承水果这个基类,水果的基类包含一个eat函 ...