【LeetCode】840. Magic Squares In Grid 解题报告(Python)
作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/
题目地址:https://leetcode.com/problems/magic-squares-in-grid/description/
题目描述
A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.
Given an grid of integers, how many 3 x 3 “magic square” subgrids are there? (Each subgrid is contiguous).
Example 1:
Input: [[4,3,8,4],
[9,5,1,9],
[2,7,6,2]]
Output: 1
Explanation:
The following subgrid is a 3 x 3 magic square:
438
951
276
while this one is not:
384
519
762
In total, there is only one magic square inside the given grid.
Note:
- 1 <= grid.length <= 10
- 1 <= grid[0].length <= 10
- 0 <= grid[i][j] <= 15
题目大意
判断一个大矩阵中有多少河图。河图这个词很古典文化,其实就是1到9填在9个格子中,让横竖斜的3个数相加都相等。
解题方法
利用河图规律
直接按照河图的规定去做就OK了。用到了一个结论:河图的中心数字是5.
注意一个易忽略的点,就是所有的数字应该在1~9之间。测试用例里面出现了不在这个范围内的数字也能组成河图。
另外,关于河图,其实有很多有用的结论,我并没有使用。
河图记忆方法:偶角奇边坐心五.一线双角相对画.
这个帖子挺有意思的:1到9填在9个格子中,让横竖斜的3个数相加都相等
class Solution:
def numMagicSquaresInside(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
if len(grid) < 3 or len(grid[0]) < 3:
return 0
counter = 0
for row in range(len(grid) - 2):
for col in range(len(grid[0]) - 2):
sub_matrix = [[grid[row + i][col + j] for j in range(3)] for i in range(3)]
if self.magic_square(sub_matrix):
counter += 1
return counter
def magic_square(self, matrix):
is_number_right = all(1 <= matrix[i][j] <= 9 for i in range(3) for j in range(3))
is_row_right = all(sum(row) == 15 for row in matrix)
is_col_right = all(sum(col) == 15 for col in [[matrix[i][j] for i in range(3)] for j in range(3)])
is_diagonal_right = matrix[1][1] == 5 and matrix[0][0] + matrix[-1][-1] == 10 and matrix[0][-1] + matrix[-1][0] == 10
is_repeat_right = len(set(matrix[i][j] for i in range(3) for j in range(3))) == 9
return is_number_right and is_row_right and is_col_right and is_diagonal_right and is_repeat_right
暴力解法
二刷的时候完全忘了什么性质了……直接暴力解法,这样的话,需要按照题目做各种判断,所以函数更为复杂了。
class Solution(object):
def numMagicSquaresInside(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
M, N = len(grid), len(grid[0])
res = 0
for r in range(M - 2):
for c in range(N - 2):
curgrid = [[grid[r + i][c + j] for j in range(3)] for i in range(3)]
if self.isMagic(curgrid):
res += 1
return res
def isMagic(self, grid):
count = list(range(9))
for i in range(3):
for j in range(3):
if not (1 <= grid[i][j] <= 9):
return False
count[grid[i][j] - 1] += 1
if 0 in count: return False
row, col = [0, 0, 0], [0, 0, 0]
for i in range(3):
row[i] += sum(grid[i][j] for j in range(3))
for j in range(3):
col[j] += sum(grid[i][j] for i in range(3))
if row[0] != row[1] != row[2] or col[0] != col[1] != col[2]:
return False
if grid[0][0] + grid[2][2] != grid[0][2] + grid[2][0]:
return False
return True
日期
2018 年 5 月 27 日 —— 周末的天气很好~
2018 年 11 月 24 日 —— 周六快乐
【LeetCode】840. Magic Squares In Grid 解题报告(Python)的更多相关文章
- 【Leetcode_easy】840. Magic Squares In Grid
problem 840. Magic Squares In Grid solution: class Solution { public: int numMagicSquaresInside(vect ...
- 840. Magic Squares In Grid (5月27日)
开头 这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧 题目原文 Magic Squares In Gri ...
- [LeetCode] 840. Magic Squares In Grid_Easy
A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, co ...
- 840. Magic Squares In Grid ——weekly contest 86
题目链接:https://leetcode.com/problems/magic-squares-in-grid/description attention:注意给定的数字不一定是1-9. time: ...
- 840. Magic Squares In Grid
class Solution { public: int numMagicSquaresInside(vector<vector<int>>& grid) { ; in ...
- 【LeetCode】206. Reverse Linked List 解题报告(Python&C++&java)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 迭代 递归 日期 [LeetCode] 题目地址:h ...
- 【LeetCode】654. Maximum Binary Tree 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...
- 【LeetCode】784. Letter Case Permutation 解题报告 (Python&C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 回溯法 循环 日期 题目地址:https://leet ...
- 【LeetCode】764. Largest Plus Sign 解题报告(Python)
[LeetCode]764. Largest Plus Sign 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn ...
随机推荐
- 编程艺术第十六~第二十章:全排列/跳台阶/奇偶调序,及一致性Hash算法
目录(?)[+] 第十六~第二十章:全排列,跳台阶,奇偶排序,第一个只出现一次等问题 作者:July.2011.10.16.出处:http://blog.csdn.net/v_JULY_v. 引言 ...
- BIO/NIO/AIO对比
IO 模型 就是使用什么样的通道进行数据的发送和接收,很大程度上决定了程序通信的性能. Java 支持三种网络编程模型:BIO.NIO.AIO. Java BIO,同步并阻塞(传统阻塞型),服务器实现 ...
- Hive(十一)【压缩、存储】
目录 一.Hadoop的压缩配置 1.MR支持的压缩编码 2.压缩参数配置 3.开启Mapper输出阶段压缩 4.开启Reduceer输出阶段 二.文件存储 1.列式存储和行式存储 2.TextFil ...
- C++ 德才论
输入样例: 14 60 80 10000001 64 90 10000002 90 60 10000011 85 80 10000003 85 80 10000004 80 85 10000005 8 ...
- 08-认证(Authorization)
这又是一个非常实用的功能,对我们做接口测试来说,经常要处理登录认证的情况 .如果不用这个Authorization其实也能解决认证的问题,无非就是把要认证的数据按照要求在指定位置传入参数即可.比如我们 ...
- tomcat 8 内存优化
在Linux环境下设置Tomcat JVM,在/opt/tomcat/bin/catalina.sh文件中找到"# ----- Execute The Requested Command&q ...
- SpringBoot(3):SpringData 数据访问
一. 简介 Spring Data是一个用于简化数据库访问,并支持云服务的开源框架:其主要目标是 使得对数据的访问变得方便快捷.对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系 ...
- Dubbo管控平台
2019年初,官方发布了Dubbo管理控制台0.1版本.结构上采取了前后端分离的方式,前端使用Vue和Vuetify分别作为Javascript框架和UI框架,后端采用Spring Boot框架 一. ...
- 端口占用,windows下通过命令行查看和关闭端口占用的进程
1.查找所有端口号对应的PID 端口号:8080 命令:netstat -ano|findstr "8080" 2.找到端口的PID并关闭 PID:1016 命令:taskkill ...
- 【C/C++】BanGDream活动点数计算器
作为一个白嫖咸鱼,我每个活动都只打出三星卡就不玩了,于是写了一个模拟器,算算还要打几把hhh #include <iostream> #include <algorithm> ...