C#LeetCode刷题之#840-矩阵中的幻方(Magic Squares In Grid)
问题
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。
3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 m * n 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
输入: [[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 <= grid.length = grid[0].length <= 10
0 <= grid[i][j] <= 15
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).
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
276while this one is not:
384
519
762In 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
示例
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。
public class Program {
public static void Main(string[] args) {
int[][] nums = null;
nums = new int[3][] {new int[]{4,3,8,4},
new int[] {9,5,1,9},
new int[] {2,7,6,2}
};
var res = NumMagicSquaresInside(nums);
Console.WriteLine(res);
nums = new int[3][] {new int[]{1,0,3,8},
new int[] {3,7,2,4},
new int[] {5,8,1,0}
};
res = NumMagicSquaresInside2(nums);
Console.WriteLine(res);
Console.ReadKey();
}
private static int NumMagicSquaresInside(int[][] grid) {
var num = 0;
for(var i = 1; i < grid.Length - 1; i++) {
for(var j = 1; j < grid[i].Length - 1; j++) {
if(grid[i][j] == 5) {
num = IsMagicSquare(grid, i, j) ? ++num : num;
}
}
}
return num;
}
private static bool IsMagicSquare(int[][] grid, int i, int j) {
//原始解法,不推荐
//记录每个值,看是不是9位,因为从1-9都必须出现
var dic = new Dictionary<int, int>();
dic[grid[i - 1][j - 1]] = grid[i - 1][j - 1];
dic[grid[i - 1][j]] = grid[i - 1][j];
dic[grid[i - 1][j + 1]] = grid[i - 1][j + 1];
dic[grid[i][j - 1]] = grid[i][j - 1];
dic[grid[i][j]] = grid[i][j];
dic[grid[i][j + 1]] = grid[i][j + 1];
dic[grid[i + 1][j - 1]] = grid[i + 1][j - 1];
dic[grid[i + 1][j]] = grid[i + 1][j];
dic[grid[i + 1][j + 1]] = grid[i + 1][j + 1];
//不为9或不在1-9范围之内,则不是幻方
if(dic.Count != 9) return false;
foreach(var item in dic) {
if(item.Value > 9 || item.Value < 0) return false;
}
//记录3行、3列、2对角线
var sum_row1 = grid[i - 1][j - 1] + grid[i - 1][j] + grid[i - 1][j + 1];
var sum_row2 = grid[i][j - 1] + grid[i][j] + grid[i][j + 1];
var sum_row3 = grid[i + 1][j - 1] + grid[i + 1][j] + grid[i + 1][j + 1];
var sum_col1 = grid[i - 1][j - 1] + grid[i][j - 1] + grid[i + 1][j - 1];
var sum_col2 = grid[i - 1][j] + grid[i][j] + grid[i + 1][j];
var sum_col3 = grid[i - 1][j + 1] + grid[i][j + 1] + grid[i + 1][j + 1];
var sum_cross1 = grid[i - 1][j - 1] + grid[i][j] + grid[i + 1][j + 1];
var sum_cross2 = grid[i - 1][j + 1] + grid[i][j] + grid[i + 1][j - 1];
var dic2 = new Dictionary<int, int>();
dic2[sum_row1] = 0;
dic2[sum_row2] = 0;
dic2[sum_row3] = 0;
dic2[sum_col1] = 0;
dic2[sum_col2] = 0;
dic2[sum_col3] = 0;
dic2[sum_cross1] = 0;
dic2[sum_cross2] = 0;
//看值是不是相同并且值之和为15
return dic2.Count == 1 && sum_row1 == 15;
}
private static int NumMagicSquaresInside2(int[][] grid) {
var num = 0;
for(var i = 1; i < grid.Length - 1; i++) {
for(var j = 1; j < grid[i].Length - 1; j++) {
if(grid[i][j] == 5) {
num = IsMagicSquare(grid, i, j) ? ++num : num;
}
}
}
return num;
}
private static bool IsMagicSquare2(int[][] grid, int row, int col) {
//值必须是1-9
for(var i = row - 1; i <= row + 1; i++)
for(var j = col - 1; j <= col + 1; j++)
if(grid[i][j] < 1 || grid[i][j] > 9) return false;
//不考虑中间的5,只需要考虑4个位置的值的和为10即可
return !(grid[row - 1][col - 1] + grid[row + 1][col + 1] != 10 ||
grid[row - 1][col] + grid[row + 1][col] != 10 ||
grid[row - 1][col + 1] + grid[row + 1][col - 1] != 10 ||
grid[row][col - 1] + grid[row][col + 1] != 10);
}
}
以上给出2种算法实现,以下是这个案例的输出结果:
该文章的最新版本已迁移至个人博客【比特飞】,单击链接 https://www.byteflying.com/archives/3752 访问。
1
0
分析:
显而易见,以上2种算法的时间复杂度均为: 。
C#LeetCode刷题之#840-矩阵中的幻方(Magic Squares In Grid)的更多相关文章
- [Swift]LeetCode840. 矩阵中的幻方 | Magic Squares In Grid
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 ...
- leetcode刷题-54螺旋矩阵
题目 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 思路 对于每个外层,从左上方开始以顺时针的顺序遍历所有元素.假设当前层的左上角位于(to ...
- Leetcode刷题之螺旋矩阵
矩阵之螺旋矩阵 总体思路: 注意遍历顺序 每次遍历一圈时候不要多加元素 Leetcode54螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素. ...
- leetcode刷题-59螺旋矩阵2
题目 给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵. 思路 与螺旋矩阵题完全一致 实现 class Solution: def generateM ...
- C#LeetCode刷题之#671-二叉树中第二小的节点(Second Minimum Node In a Binary Tree)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4100 访问. 给定一个非空特殊的二叉树,每个节点都是正数,并且每 ...
- C#LeetCode刷题之#532-数组中的K-diff数对(K-diff Pairs in an Array)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/3716 访问. 给定一个整数数组和一个整数 k, 你需要在数组里找 ...
- C#LeetCode刷题之#720-词典中最长的单词(Longest Word in Dictionary)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4120 访问. 给出一个字符串数组words组成的一本英语词典.从 ...
- leetcode刷题-94二叉树的中序遍历
题目 给定一个二叉树,返回它的中序 遍历. 实现 # def __init__(self, x): # self.val = x # self.left = None # self.right = N ...
- C#LeetCode刷题-数组
数组篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 43.1% 简单 4 两个排序数组的中位数 C#LeetCode刷题之#4-两个排序数组 ...
随机推荐
- 抽象工厂模式(c++实现)
抽象工厂模式 目录 抽象工厂模式 模式定义 模式动机 UML类图 源码实现 优点 缺点 感悟 模式定义 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,而 ...
- 将一个Linux系统中的文件或文件夹复制到另一台Linux服务器上(scp的使用)
一.复制文件: (1)将本地文件拷贝到远程scp 文件名 用户名@计算机IP或者计算机名称:远程路径(2)从远程将文件拷回本地scp 用户名@计算机IP或者计算机名称:文件名 本地路径 二.复制文件夹 ...
- DJANGO-天天生鲜项目从0到1-013-订单-支付宝支付
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- vue学习(五) 访问vue内部元素或者方法
//html <div id="app"> <input type="button" value="ok" v-bind: ...
- Spring Security 实战干货:理解AuthenticationManager
1. 前言 我们上一篇介绍了UsernamePasswordAuthenticationFilter的工作流程,留下了一个小小的伏笔,作为一个Servlet Filter应该存在一个doFilter实 ...
- 解决智慧城市发展困扰:Web 3D 智慧环卫 GIS 系统
前言 智慧环卫,依托物联网技术与移动互联网技术,对环卫管理所涉及到的人.车.物.事进行全过程实时管理,合理设计规划环卫管理模式,提升环卫作业质量,降低环卫运营成本,用数字评估和推动垃圾分类管理实效.智 ...
- 小书MybatisPlus第9篇-常用字段默认值自动填充
本文为Mybatis Plus系列文章的第9篇,前8篇访问地址如下: 小书MybatisPlus第1篇-整合SpringBoot快速开始增删改查 小书MybatisPlus第2篇-条件构造器的应用及总 ...
- Spring集成Quartz定时任务
1.导入jar包 2.配置applicationContext.xml文件 <!-- 任务调度1 --> <!-- bean id="simpleJob" cla ...
- 萌新学渗透系列之Hack The Box_Lame
我将我的walkthrough过程用视频解说的形式记载 视频地址https://www.bilibili.com/video/BV1Mv411z75c 一是因为看我视频的后来者应该都是刚入门的新手,视 ...
- WSGI应用程序示例
import time # WSGI允许开发者自由搭配web框架和web服务器 def app(environ,start_response): status = '200 OK' response_ ...