[美团春招笔试题]小美的平衡矩阵(golang实现)

题目

小美拿到了一个n∗nn∗n的矩阵,其中每个元素是 0 或者 1。小美认为一个矩形区域是完美的,当且仅当该区域内 0 的数量恰好等于 1 的数量。现在,小美希望你回答有多少个i∗ii∗i的完美矩形区域。你需要回答1≤i≤n1≤i≤n的所有答案。

思路

使用前缀和

  • 使用前缀和(Prefix Sum)来快速计算任意子矩阵中 0 和 1 的数量。

代码实现

package main

import (
	"fmt"
)

func main() {
	var n int
	fmt.Scan(&n)

	// 读取矩阵并初始化
	matrix := make([][]int, n)
	for i := range matrix {
		matrix[i] = make([]int, n)
		var temp string
		fmt.Scan(&temp)
		for j := 0; j < n; j++ {
			if temp[j] == '0' {
				matrix[i][j] = 0
			} else {
				matrix[i][j] = 1
			}
		}
	}

	// 计算前缀和
	prefix0 := make([][]int, n+1)
	prefix1 := make([][]int, n+1)
	for i := 0; i <= n; i++ {
		prefix0[i] = make([]int, n+1)
		prefix1[i] = make([]int, n+1)
	}

	for i := 1; i <= n; i++ {
		for j := 1; j <= n; j++ {
            if matrix[i-1][j-1] == 1{
                prefix0[i][j] = prefix0[i-1][j] + prefix0[i][j-1] - prefix0[i-1][j-1] 
                prefix1[i][j] = prefix1[i-1][j] + prefix1[i][j-1] - prefix1[i-1][j-1] + 1
            }else{
                prefix0[i][j] = prefix0[i-1][j] + prefix0[i][j-1] - prefix0[i-1][j-1] + 1
			    prefix1[i][j] = prefix1[i-1][j] + prefix1[i][j-1] - prefix1[i-1][j-1]
            }
			
		}
	}

	// 遍历所有可能的子矩阵大小
	for k := 1; k <= n; k++ {
		if k%2 != 0 {
			fmt.Println(0)
			continue
		}

		ans := 0

		// 遍历所有可能的子矩阵
		for i := 0; i+k <= n; i++ {
			for j := 0; j+k <= n; j++ {
				// 使用前缀和快速计算子矩阵中 0 和 1 的数量
				count0 := prefix0[i+k][j+k] - prefix0[i][j+k] - prefix0[i+k][j] + prefix0[i][j]
				count1 := prefix1[i+k][j+k] - prefix1[i][j+k] - prefix1[i+k][j] + prefix1[i][j]

				if count0 == count1 {
					ans++
				}
			}
		}

		fmt.Println(ans)
	}
}

代码解析

(1) 前缀和计算

  • 使用 prefix0 和 prefix1 两个二维数组来存储 0 和 1 的前缀和。
  • 前缀和的计算公式:go复制

(2) 子矩阵的快速计算

  • 使用前缀和快速计算任意子矩阵中 0 和 1 的数量:go复制

(3) 减少重复计算

  • 通过前缀和避免了每次重新计算子矩阵的值,减少了时间复杂度。

(4) 代码结构优化

  • 将前缀和的计算和子矩阵的遍历分开,提高了代码的可读性。
#美团#
全部评论
美团招go吗
点赞 回复 分享
发布于 2025-03-30 16:00 重庆
Phone监控是个啥?右后45°拍屏幕嘛?求解答
点赞 回复 分享
发布于 2025-03-14 21:07 广东

相关推荐

04-13 15:31
门头沟学院 Java
某游戏厂,面了&nbsp;1h。大部分时间都是问纯八股,项目一点没问,手撕也很简单,网上搜到的面经大部分是C++八股文轰炸或者项目拷打。是不是因为一开始就对我不感兴趣所以干脆不为难我了面经如下:自我介绍游戏经历主要编程语言(我说的Java&nbsp;但是岗位写的是C++/GoLang)求职方向是后端,为什么选择游戏服务器开发有Linux使用经历吗(项目部署)用过的Linux命令查看文件用什么命令,查看大文件呢?租服务器会关注服务器配置吗,如何确定这个配置能够满足项目部署的需求?会分析服务器使用情况吗(CPU、内存使用率),如何定位具体的线程资源使用情况?讲讲数组和链表结构、常用操作、时间复杂度为什么数组支持随机访问(内存连续+偏移量)讲讲栈和队列结构、区别、应用讲讲RabbitMQ如何用数组实现队列讲讲哈希,平时用过哪些哈希的数据结构哈希表的key如何获得什么是哈希冲突哈希底层原理了解吗面向对象三大特性现场写一下多态的例子讲讲平时用过的设计模式手撕反转链表、反转字符串反问的时候面试官说我可以自信一点()最后给点建议吧:纯八股&nbsp;+&nbsp;项目一点没问,大概率不是“不感兴趣所以不为难你”,更可能是:1,面试官习惯按固定流程走,先筛基础2,或者他觉得项目跟岗位匹配度不高,问了也白问,3,面了一个小时还给建议,说明你至少过了他的及格线。别自己加戏
查看23道真题和解析
点赞 评论 收藏
分享
04-13 09:20
已编辑
电子科技大学 C++
自我介绍&nbsp;实习1.&nbsp;去上一家公司实习的目的?2.&nbsp;为什么离职?3.&nbsp;上一家公司职场氛围和交流氛围如何?4.&nbsp;上一家公司实习主要的工作背景和产出?5.&nbsp;介绍一下上一家公司实习的背景和原理6-12.&nbsp;实习拷打13.&nbsp;上一家公司有没有&nbsp;AI&nbsp;提效工具?有没有&nbsp;AI&nbsp;培训?其他员工有没有相关的使用经验?14.&nbsp;你为什么在实习开发中使用&nbsp;AI&nbsp;工具吗?15.&nbsp;总结一下上一家公司实习你的收获是什么?16.&nbsp;实习期间,你遇到最困难的一个点?你是如何解决的?项目1.&nbsp;Raft&nbsp;项目的动机是什么?算法无闲聊1.&nbsp;你转专业了吗?还是自学?2.&nbsp;Golang&nbsp;和&nbsp;C++&nbsp;哪个用得比较多?3.&nbsp;面试官介绍&nbsp;Golang&nbsp;和&nbsp;C++&nbsp;在后端和鸡架开发之间的差异...4.&nbsp;能实习多久?专业其他同学的规划是读研还是就业?5.&nbsp;你为什么想要就业?你不用上课吗?6.&nbsp;有没有想过跨考?7.&nbsp;反问总结第一次约面后,面试官临时有会,面试前&nbsp;5&nbsp;分钟取消会议。推迟了一天,然后又迟到&nbsp;10&nbsp;分钟。自我介绍完就感觉像是&nbsp;KPI&nbsp;面了,不过没关系,感觉还是很好为人师的面试官,反问环节直接让他帮我把从&nbsp;C++&nbsp;到&nbsp;Golang&nbsp;学习路线规划了一下,也请教了一下应该阅读哪些书籍。
发面经攒人品
点赞 评论 收藏
分享
评论
1
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务