LeetCode - 129双周赛

目录

一,3127. 构造相同颜色的正方形

二,3128. 直角三角形

三,3129. 找出所有稳定的二进制数组 I

​编辑

四,3130. 找出所有稳定的二进制数组 II


一,3127. 构造相同颜色的正方形

本题就是问在一个3x3的正方形中是否存在一个2x2的正方形,其中存在大于等于3个白色或黑色的格子,如果有,返回true,没有,返回false。

代码如下: 

class Solution {
    public boolean canMakeSquare(char[][] grid) {
        return isValid(grid,0,0) || isValid(grid,0,1) || isValid(grid,1,0) || isValid(grid,1,1);
    }
    boolean isValid(char[][] grid, int i, int j){
        int cnt = 0;
        if(grid[i][j]=='W')
            cnt++;
        if(grid[i][j+1]=='W')
            cnt++;
        if(grid[i+1][j]=='W')
            cnt++;
        if(grid[i+1][j+1]=='W')
            cnt++;
        return cnt>=3 || cnt<=1;
    }
}

二,3128. 直角三角形

本题求直角三角形的个数,注意这题直角三角形的定义:只要A与B在同一行,且B与C在同一列,它就是一个直角三角形。

思路:需要枚举B所在的位置,计算出B所在行和B所在列中1的个数(row,col),然后相乘,再把其加入到答案中,注意这里B不能算在行和列中,所以是(row-1)*(col-1)。又因为每次都要使用行列中1的个数,所以可以提前使用数组预处理一下。

代码如下:

class Solution {
    public long numberOfRightTriangles(int[][] grid) {
        int n = grid.length;
        int m = grid[0].length;
        int[] row = new int[n];//每一行有几个1
        int[] col = new int[m];//每一列有几个1
        //预处理出每行每列1的个数
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                row[i] += grid[i][j];
                col[j] += grid[i][j];
            }
        }
        long ans = 0;
        //枚举B的位置
        for(int i=0; i<n; i++){
            for(int j=0; j<m; j++){
                if(grid[i][j] == 1){
                    ans += (row[i]-1)*(col[j]-1);
                }
            }
        }
        return ans;
    }
}

三,3129. 找出所有稳定的二进制数组 I

本题直接想到的做法是dfs枚举选哪个,枚举每一个位置选择的是0还是1,题目还要求连续的数不能超过limit,并且如果需要知道是否是连续的,还需要知道前一个数选的是0/1。

定义dfs(z,o,pre,cnt):剩余z个0,o个1,前一个数为pre,且同样的数连续出现了cnt次的合法方案数。

  • 当z>0时,当前数可以选0,它可以由 dfs(z-1,o,0,0==pre?cnt+1:limit) 转移过来
  • 当o>0时,当前数可以选1,它可以由 dfs(z,o-1,1,1==pre?cnt+1:limit) 转移过来
  • 终止条件:cnt==limit,return 0;o+z==0 即它是一个合法数,return 1

注:该方法如果使用哈希记忆化会超时,只能使用memo[][][][]来记忆化

代码如下:

class Solution {
    int limit;
    int MOD = (int)1e9+7;
    int[][][][] memo;
    public int numberOfStableArrays(int zero, int one, int limit) {
        this.limit = limit;
        memo = new int[zero+1][one+1][3][limit+1];
        for(int i=0; i<zero+1; i++){
            for(int j=0; j<one+1; j++){
                for(int k=0; k<3; k++){
                    Arrays.fill(memo[i][j][k],-1);
                }
            }
        }
        return dfs(0, 2, zero, one);
    }

    int dfs(int cnt, int pre, int z, int o){
        if(cnt == limit) return 0;
        if(o+z==0){
            return 1;
        } 
        if(memo[z][o][pre][cnt]!=-1) return memo[z][o][pre][cnt];
        int res = 0;
        if(z > 0)
            res = (res+dfs(pre==0?cnt+1:0, 0, z-1, o))%MOD;
        if(o > 0)
            res = (res + dfs(pre==1?cnt+1:0, 1, z, o-1))%MOD;
        memo[z][o][pre][cnt] = res%MOD;
        return res%MOD;
    }
}

四,3130. 找出所有稳定的二进制数组 II

本题和上一题一样,但是数据范围变大了,所以上述的方法不能在此使用,会超时。

重新定义一个dfs(i,j,k):i个0,j个1,且第i+j个数为k的合法方案数

  • 当 k = 0 时,我们要求的就变成了,i-1个0,j个1,且第i-1+j个数为0/1的合法方案数,即 dfs(i,j,0) = dfs(i-1,j,0) + dfs(i-1,j,1),但是dfs(i-1,j,0)中包含了最后连续limit个位置填0的方案,如果在这个方案末尾在加一个0,就有连续limit+1个0,这对于dfs(i,j,0)是不合法的,所以要减去 dfs(i-limit-1,j,1),即 dfs(i,j,0) = dfs(i-1,j,0) + dfs(i-1,j,1) - dfs(i-limit-1,j,1)
  • 当 k = 1 时,同理:dfs(i,j,1) = dfs(i,j-1,0) + dfs(i,j-1,1) - dfs(i,j-limit-1,0)
     

代码如下:

class Solution {
    int limit;
    int MOD = (int)1e9+7;
    int[][][] memo;
    public int numberOfStableArrays(int zero, int one, int limit) {
        this.limit = limit;
        memo = new int[zero+1][one+1][2];
        for(int i=0; i<zero+1; i++){
            for(int j=0; j<one+1; j++){
                Arrays.fill(memo[i][j],-1);
            }
        }
        return (dfs(zero, one, 0)+dfs(zero, one, 1))%MOD;
    }

    int dfs(int z, int o, int k){
        if(z == 0)
            return k==1 && limit>=o ? 1 : 0;
        if(o == 0)
            return k==0 && limit>=z ? 1 : 0;
        if(memo[z][o][k]!=-1) return memo[z][o][k];
        if(k == 0)
            memo[z][o][k] = (int)(((long)dfs(z-1, o, 1) + dfs(z-1, o, 0) + (z>limit ? MOD-dfs(z-limit-1, o, 1) : 0))%MOD);
        else
            memo[z][o][k] = (int)(((long)dfs(z, o-1, 1) + dfs(z, o-1, 0) + (o>limit ? MOD-dfs(z, o-limit-1, 0) : 0))%MOD);
        return memo[z][o][k];
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端如何将接口传来的列表数据(数组)直接下载成csv文件

前言&#xff1a;最近遇到一个需求&#xff0c;需要实现一个下载表格数据的操作&#xff0c;一般来说是前端请求后端的下载接口&#xff0c;将文件流下载下来&#xff0c;但是因为这个项目任务时间比较紧&#xff0c;后端没时间做下载接口&#xff0c;所以暂时由前端直接调列表…

头歌实践教学平台:投影变换v1.0

第2关&#xff1a;立方体平行投影 一.任务描述 根据提示&#xff0c;在右侧修改代码&#xff0c;并自己绘制出图形。平台会对你编写的代码进行测试。 1.本关任务 学习了解三维图形几何变换原理。 理解掌握OpenGL三维图形几何变换的方法。 理解掌握OpenGL程序的模型视图变换…

ElasticSearch面试题2

Mapping属性详细介绍/常见的字段数据类型&#xff1a; 映射(mapping)︰mapping是对索引库中文档的约束信息&#xff08;例如字段名、数据类型&#xff09;&#xff0c;类似表的结构约束&#xff1b;每个索引库都应该有自己的映射 数据库一定要先创建表才能去添加数据…

Redis缓存介绍以及常见缓存问题:穿透、雪崩和击穿

概念 缓存就是数据交换的缓冲区&#xff08;Cache&#xff09;&#xff0c;是存贮数据的临时地方&#xff0c;一般读写性能较高。 作用&#xff1a; 降低后端负载 提高读写效率&#xff0c;降低相应时间 成本&#xff1a; 数据一致性成本 代码维护成本 运维成本 缓存更…

JAVA系列 小白入门参考资料 类和对象(3)

温馨提示&#xff1a; 此篇文章需要前两篇文章作为基础。 JAVA系列 小白入门参考资料 类和对象&#xff08;1&#xff09;​​​​​​​ JAVA系列 小白入门参考资料 类和对象&#xff08;2&#xff09; 目录 1. 封装 引入封装 访问修饰符 封装的具体实现 get方法和…

Elasticsearch 索引 blocks:深入探讨数据保护

Elasticsearch 作为搜索和分析数据的首选分布式引擎在技术领域脱颖而出&#xff0c;尤其是在处理日志、事件和综合文本搜索时。 它的与众不同之处在于它如何让你使用各种块选项调整对其索引的访问。 这对于那些负责技术项目的人&#xff08;比如管理员和编码员&#xff09;来说…

计算机系统概述试题(二)

一、单项选择题 01&#xff0e;关于CPU主频、CPI、MIPS、MFLOPS&#xff0c;说法正确的是( )。 A.CPU主频是指CPU系统执行指令的频率&#xff0c;CPI是执行一条指令平均使用的频率 B.CPI是执行一条指令平均使用CPU时钟的个数&#xff0c;MIPS描述一条CPU指令平均使用 的CPU时钟…

微信小程序与web-view网页进行通信的尝试

首先&#xff0c;微信小程序向web-view传递数据一般通过地址栏传参的形式&#xff08;给src赋值或者修改hash&#xff09;&#xff0c;这样一般就已经能够满足实际开发需求了&#xff0c;所以这里主要探讨web-view向微信小程序传参。下面&#xff0c;我们从官方文档入手&#x…

计算机组成实验(4)

实验目的&#xff1a; 1. 初步了解GPIO接口与设备 2. 了解计算机系统的基本结构 3. 了解计算机各组成部分的关系 4. 了解并掌握IP核的使用方法 5. 了解SOC系统并用IP核实现简单的SOC系统 实验环境&#xff1a; 1. 计算机&#xff08;Intel Core i5以上&#xff0c;4GB内存以…

【工具】--- Adobe Illustrator 下载-入门绘图

文章目录 软件下载入门项目可看课程 尝试使用Adobe Illustrator&#xff08;设计师常用软件&#xff09;进行科研绘图。 软件下载 阿里云盘下载 入门项目 绘制一个箭头并保持为SVG&#xff0c; 直线->画线->窗口->描边->选择想要的箭头样式->颜色->改为蓝…

git误操作版本回退的方法

场景&#xff1a;在使用git进行代码提交的时候不小心执行了git reset 命令进行了版本回退但是在这之前进行了git add . git commit -m "提交"等命令&#xff0c;正常情况下就可以直接使用 git reset 版本号 进行代码的回退&#xff0c;但是发现自己不能找打上一个提…

机器学习:逻辑回归

概念 首先&#xff0c;逻辑回归属于分类算法&#xff0c;是线性分类器。我们可以认为逻辑回归是在多元线性回归的基础上把结果给映射到0-1的区间内&#xff0c;hθ&#xff08;x&#xff09;越接近1越有可能是正例&#xff0c;反之&#xff0c;越接近0越有可能是负例。那么&am…

IC设计数据传输 如何能保障安全高效?

IC&#xff08;集成电路&#xff09;设计数据&#xff0c;对于IC设计企业来说&#xff0c;其重要性不言而喻。所以IC设计数据传输过程中&#xff0c;其安全性和效率&#xff0c;也需要有保障。 首先我们来看看IC设计数据为什么重要&#xff0c;其重要性体现在多个方面&#xff…

edge 入门基础了解使用

随着Windows 11的发布&#xff0c;Microsoft Edge也迎来了新的更新和改进。作为一名长期使用Edge的用户&#xff0c;我不仅注意到了这些表面的变化&#xff0c;还深入研究了Edge在Windows 11上的新特性和潜在优势。 快捷方式 查找框 在Microsoft Edge浏览器中&#xff0c;按…

踩坑Mybatis + Mybatis-plus + MyBatis-plus-join

数据库里有两张表 tb_bursary和tb_student tb_bursary里关联了tb_student.id作为外键 由于tb_student表可以单独操作&#xff0c;而tb_bursary需要联合tb_student查询 所以一开始&#xff0c;我是用mybatis-plus mybaits混合的模式 mybatis-plus单独操作tb_student表&…

学习 Rust 第 22 天:mini_grep 第 2 部分

书接上文&#xff0c;在本文中&#xff0c;我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试&#xff0c;我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念&#xff0c;例如错误处理、环境…

小程序SSL证书更新指南

随着网络技术的不断发展&#xff0c;小程序已经成为许多企业和个人进行业务推广和服务提供的重要平台。在享受小程序带来的便利和高效的同时&#xff0c;我们也必须重视其安全性问题。SSL证书作为保障小程序数据传输安全的重要手段&#xff0c;其更新工作不容忽视。本文将为大家…

在线教程|零门槛部署 Llama 3,70B 版本只占 1.07G 存储空间,新用户免费体验 8B 版本

4 月 18 日&#xff0c;Meta 宣布开源 Llama 3&#xff0c;这个号称「迄今为止最好的开源大模型」一经发布&#xff0c;立刻引爆科技圈&#xff01; 发布当天恰逢斯坦福大学教授、AI 顶尖专家吴恩达的生日&#xff0c;作为 AI 开源倡导者&#xff0c;他激动地发文表示&#xff…

CogAgent:开创性的VLM在GUI理解和自动化任务中的突破

尽管LLMs如ChatGPT在撰写电子邮件等任务上能够提供帮助&#xff0c;它们在理解和与GUIs交互方面存在挑战&#xff0c;这限制了它们在提高自动化水平方面的潜力。数字世界中的自主代理是许多现代人梦寐以求的理想助手。这些代理能够根据用户输入的任务描述自动完成如在线预订票务…

【doghead】ubuntu构建libuv

按照官方的文档2024年3月的版本。首先构建libuv 最终构建的还得了test 构建过程 zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/thunderbolt/ayame/zhb-bifrost$ ls Bifrost-202403 README.md draw player-only worker 大神的带宽估计.png zhangbin@DESKTOP-1723CM1:/mnt/d/XTRANS/…
最新文章