小美的平衡矩阵(前缀和例题)

news2024/9/22 15:35:23

        2024美团秋招,被这一题给难住了 美团校招笔试真题_Java工程师、C++工程师_牛客网

题目:

        

        

解答:

        这道题的关键点就是要计算出以某一点为矩阵右下角时,1的个数

        我一开始是想着遍历,以某一点为起点(矩阵左上角),遍历i*i的矩阵,但是要用五层循环,超时了。然后又想着将之前的矩阵的结果保留下来,这样计算新矩阵时就能大大减少遍历次数,只用查看前面矩阵的结果来推算出当前矩阵的结果,可是我用的是动态规划,会计算左边和上边的值,这有一个问题,就是左上角对角线位置的值会被计算两次,因为上边的左边算了一次,左边的上边也算了一次。后来看了别人的代码,发现只要动态规划时只计算一边,即上边或者左边的值,另一个值在本次循环的时候单独计算就能解决了,这就是前缀和,用于在数组或矩阵中快速计算某个区间内的元素和。

        这道题的思路就是,用前缀和计算出从左上角[0,0]到右下角[x,y]这个范围内的矩阵的值,这样,如果想要计算以[x,y]为终点的 i*i 的矩阵的值,就只需要用[x,y]的值减去[x-i,y]和[x,y-1]的值再加上以[x-i,y]为终点、以[x,y-1]为终点这两个矩阵的重合部分(刚刚被减了两次)就行了。

        之后再对结果进行判断,就能知道以[x,y]为终点的 i*i 的矩阵是否是平衡矩阵。如果是则记录。

        这种方法只有三层循环,大大降低了时间复杂度。

int main() {
    int n = 4;
    vector<string> matrix(n);
    matrix[0] = "1010";
    matrix[1] = "0101";
    matrix[2] = "1100";
    matrix[3] = "0011";


    vector<vector<int>> dp(n + 1, vector<int>(n + 1));

    for (int i = 0; i < n; i++) {
        int sum = 0;
        //动态规划,但是如果又加上面又加左边会导致对角线左上方被算两次,所以只动态规划算上面,左边的单独在本趟算
        for (int j = 0; j < n; j++) {
            if (matrix[i][j] == '1') sum++;
            dp[i + 1][j + 1] = sum + dp[i][j + 1];
        }
    }


    vector<int> res(n + 1);

    //i*i的矩阵
    for (int i = 1; i <= n; i++) {
        //当矩阵内元素个数为奇数,一定不平衡
        //一个奇数的平方一定是奇数
        if (i % 2 != 0) {
            res[i] = 0;
            continue;
        }
        //以[x,y]为起点的矩阵,其右下角值=以其右下角为终点的矩阵的1的个数
        //x+i-1 -- i为2时,计算x和x+1位置,那么包括x位置在内,总共i个位置需要合法,也就是接下来的i-1个位置需要合法
        for (int x = 1; x + i - 1 <= n; x++) {
            for (int y = 1; y + i - 1 <= n; y++) {
                //[x+i-1][y+i-1]的值是从[1,1]到[x+i-1][y+i-1]的值
                //  那么如果要计算以[x+i-1][y+i-1]为终点的i*i矩阵1的值,需要减去以[x+i-1][y-1]为终点的矩阵2的值和以[x-1][y+i-1]为终点的矩阵3的值
                //  这还不够,矩阵2和矩阵3有一个重合的区域,如果只是减的话,重合的区域会被减两次,所以减完后还需要加上一个重合的区域的值,也就是以[x-1][y-1]为终点的矩阵4的值
                int val = dp[x + i - 1][y + i - 1] - dp[x + i - 1][y - 1] - dp[x - 1][y + i - 1] + dp[x - 1][y - 1];
                if (val == (i * i) / 2) {
                    res[i]++;
                }
            }
        }
    }
    for (int i = 1; i <= n; i++) {
        cout << res[i] << endl;
    }


    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1552686.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Machine Learning机器学习之统计分析

目录 前言 机器学习之统计分析 统计学的主要目标包括&#xff1a; 统计学核心概念&#xff1a; 统计基础&#xff1a; 训练误差&#xff1a; 常见的损失函数&#xff1a; 正则化和交叉验证 博主介绍&#xff1a;✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉…

TBSI模型论文解读及代码分析

前往我的主页以获得更好的阅读体验 简介 论文来源: Bridging Search Region Interaction With Template for RGB-T Tracking 现有的搜索算法通常会直接连接 RGB 和 T 模态搜索区域, 该方法存在大量冗余背景噪声. 而另一些方法从搜索帧中采样候选框, 对孤立的 RGB 框和 T 框进…

RISC-V特权架构 - 中断定义

RISC-V特权架构 - 中断定义 1 中断类型1.1 外部中断1.2 计时器中断1.3 软件中断1.4 调试中断 2 中断屏蔽3 中断等待4 中断优先级与仲裁5 中断嵌套6 异常相关寄存器 本文属于《 RISC-V指令集基础系列教程》之一&#xff0c;欢迎查看其它文章。 1 中断类型 RISC-V 架构定义的中…

Autodesk Maya 2025---智能建模与动画创新,重塑创意工作流程

Autodesk Maya 2025是一款顶尖的三维动画软件&#xff0c;广泛应用于影视广告、角色动画、电影特技等领域。新版本在功能上进行了全面升级&#xff0c;新增了对Apple芯片的支持&#xff0c;建模、绑定和角色动画等方面的功能也更加出色。 在功能特色方面&#xff0c;Maya 2025…

RabbitMQ安装及使用笔记

RabbitMQ安装及使用笔记 RabbitMQ是一个开源的消息代理软件&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c;用于在分布式系统中进行消息传递。 1.安装 利用docker load命令加载mq镜像 docker load -i mq.tar 基于Docker来安装RabbitMQ&#xff…

网络空间测绘系统的商业应用

随着网络空间的不断发展和扩展&#xff0c;网络安全已经成为当今社会面临的重要挑战之一。为了有效应对网络安全威胁&#xff0c;网络空间测绘系统应运而生&#xff0c;成为网络安全领域的重要工具。 网络空间测绘系统不仅能够帮助安全研究人员进行研究和管理&#xff0c;还能为…

3.28总结

1.java学习记录 1.方法的重载 重载换而言之其实就是函数名不变&#xff0c;但是其中的参数需要改变&#xff0c;可以三个方面改变&#xff08;参数类型&#xff0c;参数顺序&#xff0c;参数个数这三个方面入手&#xff0c;这样可以运用的&#xff09; 但是&#xff1a;注意…

边缘计算AI盒子目前支持的AI智能算法、视频智能分析算法有哪些,应用于大型厂矿安全生产风险管控

一、前端设备实现AI算法 主要是基于安卓的布控球实现&#xff0c;已有的算法包括&#xff1a; 1&#xff09;人脸&#xff1b;2&#xff09;车牌&#xff1b;3&#xff09;是否佩戴安全帽&#xff1b;4&#xff09;是否穿着工装&#xff1b; 可以支持定制开发 烟雾&#xf…

API是什么,如何保障API安全

随着移动APP、微服务架构、云、物联网的兴起&#xff0c;企业API数量呈爆发式增长。作为数字世界的连接者&#xff0c;API为企业搭建起了一条内外相连、四通八达的“数据公路”。 API是什么&#xff1f;API&#xff0c;全称Application Programming Interface&#xff0c;即应用…

黑马头条知识点总结

黑马头条知识点总结 文章目录 黑马头条知识点总结前言一、使用的所有技术栈二、初始化项目 2.1加密盐登录2.2网关2.3配置nginx三。文章通过freemarker生成html文件存入minio中四。内容安全阿里云接口5.使用延迟任务发布审核文章 4.9.3)redis分布式锁在工具类CacheService中添加…

CI/CD实战-jenkins结合ansible

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3&#xff0c;server4作为测试主机&#xff0c;停掉其上后面的docker 在server2&#xff08;jenkins&#xff09;主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

数据结构:基于数组实现栈

1 前言 栈是一种先进后出的线性表。向一个栈插入新元素可以叫做进栈、入栈、压栈&#xff0c;新元素必须放到栈顶元素上面&#xff0c;使之成为新的栈顶&#xff1b;从一个栈删除元素可以叫做出栈、退栈&#xff0c;它将栈顶元素删除&#xff0c;使和原来栈顶元素相邻的元素称…

MySQL创建表:练习题

练习题&#xff1a; 创建一个名为"students"的数据库&#xff0c;并切换到该数据库。 在"students"数据库中创建一个名为"grades"的表&#xff0c;包含以下字段&#xff1a; id: 整数类型 name: 字符串类型&#xff0c;学生姓名 subject: 字符串…

代码随想录阅读笔记-二叉树【层序遍历相关题目】

1、二叉树的层次遍历II 题目 给定一个二叉树&#xff0c;返回其节点值自底向上的层次遍历。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历&#xff09; 思路 相比上个博客中的层序遍历&#xff0c;这里需要做的仅仅是把最后的result数组反…

QT中的 容器(container)简介

Qt库提供了一套通用的基于模板的容器类&#xff0c;可以用这些类存储指定类型的项。比如&#xff0c;你需要一个大小可变的QString的数组&#xff0c;则使用QVector<QString>。 这些容器类比STL&#xff08;C标准模板库&#xff09;容器设计得更轻量、更安全并且更易于使…

【C语言基础】:数据在内存中的存储

文章目录 一、整数在内存中的存储二、大小端字节序和字节序判断1. 为什么有大小端&#xff1f;2. 练习 三、浮点数在内存中的存储1. 浮点数的存储1.1 浮点数的存储过程1.2 浮点数取的过程 四、题目解析 书山有路勤为径&#xff0c;学海无涯苦作舟。 创作不易&#xff0c;宝子们…

springboot+vue在idea上面的使用小结

1.在mac上面删除java的jdk方法&#xff1a; sudo rm -rfjdk的路径 sudo rm -rf /Users/like/Library/Java/JavaVirtualMachines/corretto-17.0.10/Contents/Home 2.查询 Mac的jdk版本和路径&#xff1a; /usr/libexec/java_home -V 3.mac上面查询和关闭idea的网页端口&…

Jackson 2.x 系列【6】注解大全篇二

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Jackson 版本 2.17.0 源码地址&#xff1a;https://gitee.com/pearl-organization/study-jaskson-demo 文章目录 注解大全2.11 JsonValue2.12 JsonKey2.13 JsonAnySetter2.14 JsonAnyGetter2.15 …

增强现实(AR)和虚拟现实(VR)营销的未来:沉浸式体验和品牌参与

--- 如何将AR和VR技术应用于营销&#xff0c;以提高品牌知名度、客户参与度 增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08;VR&#xff09;不再只是游戏。这些技术为品牌与受众互动提供了创新的方式。营销人员可以创造更好的客户体验&#xff0c;并为身临其境的故…

Docker进阶:使用Docker部署Harbor私有镜像仓库

Docker进阶&#xff1a;使用Docker部署Harbor私有镜像仓库 1、安装Docker和Docker Compose1、安装Docker、Docker Compose2、验证Docker和Docker Compose是否成功安装3、先启动运行docker服务 2、下载并配置Harbor1、下载最新版本的Harbor离线安装包2、配置Harbor的主机名和管理…