这是悦乐书的第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. 用小程序做一个类似于苹果AssistiveTouch功能

    一.首先我先介绍一下,我们要做一个什么样的项目功能 项目功能就是一个音频点击播放,当点击为播放的状态时,一个音频的动图出现,而且是可以跟随着手指的滑动而滑动,而且,在滑动动图的时候,当前下的页面是不可 ...

  2. jmeter录制对于ip代理会失效

    jmeter对于ip代理会失效,ip不能走代理,只有域名可以,因此如果需要用jmeter录制ip代理的请求,需要配置hosts访问,将ip转换成域名 如访问http://127.0.0.1:8080/ ...

  3. vue3之组件

    目录 组件 根组件 局部组件 全局组件 组件的注册 组件名 组件名大小写 全局注册 局部注册 模块系统 组件注册实例: 组件化 组件间数据的传递 父组件传递数据给子组件 父组件传递数据给子组件例子 子 ...

  4. 使用tensorflow训练word2vec

    from http://blog.csdn.net/wangyangzhizhou/article/details/77530479?locationNum=1&fps=1 使用了tensor ...

  5. SecureRandom的坑

    之前写随机数的时候一直用SecureRandom.getInstanceStrong()方法生成SecureRandom实例,进而调用其各种next方法.突然有一次,发现next方法卡住了, 每一次调 ...

  6. golang rabbitmq实践 (一 rabbitmq配置)

    1:环境选择 系统为ubuntu 15.04 ,我装在虚拟机里面的 2:rabbitmq tabbitmq 3.5.4  download url : http://www.rabbitmq.com/ ...

  7. windows10 gcc编译C程序(分步编译)

    下面演示gcc对C源程序的分步编译过程: 1. 编译(Compile) gcc hello.cpp -c # 生成hello.o,目标文件名字和源文件名字一样,VC编译会生成.ojb文件,gcc编译器 ...

  8. 【python学习之五】自定义函数实现用 Python 发送电子邮件

    前言 之前论坛里有人发过关于发送邮件的帖子,设计器也有关于发送邮件的控件.我这里再次重复,希望能有帮到大家的地方. 信息准备 发送邮件前必须准备好一些基本信息,例如发件人邮箱地址.发件人邮箱密码.收件 ...

  9. 使用kibana构建各种图

    1.3.1:建立索引 以下命令来为莎士比亚数据集设置 mapping(映射): curl -XPUT http://hadoop01:9200/shakespeare -d '{ "mapp ...

  10. es之批量提交操作

    1:批量查询操作 1):插入测试数据 PUT /costumer/doc/1{ "name": "zhangsan", "age": 20} ...