Leetcode 第 129 场双周赛题解

news2024/12/22 20:22:56

Leetcode 第 129 场双周赛题解

  • Leetcode 第 129 场双周赛题解
    • 题目1:3127. 构造相同颜色的正方形
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3128. 直角三角形
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3129. 找出所有稳定的二进制数组 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3130. 找出所有稳定的二进制数组 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 129 场双周赛题解

题目1:3127. 构造相同颜色的正方形

思路

枚举 + 计数。

枚举矩阵中的每个 2×2 子矩形。

对于每个子矩形,统计 B 和 W 的个数,如果其中一个字母的出现次数 ≥3,则返回 true。

如果 4 个子矩形都不满足要求,返回 false。

代码

/*
 * @lc app=leetcode.cn id=3127 lang=cpp
 *
 * [3127] 构造相同颜色的正方形
 */

// @lc code=start
class Solution
{
public:
    bool canMakeSquare(vector<vector<char>> &grid)
    {
        // 判断以 (row, col) 为左上角的 2*2 的正方形是否满足要求
        auto check = [&](int row, int col) -> bool
        {
            int cntB = 0, cntW = 0;
            for (int i = row; i <= row + 1; i++)
                for (int j = col; j <= col + 1; j++)
                {
                    if (grid[i][j] == 'B')
                        cntB++;
                    else
                        cntW++;
                }
            return cntB >= 3 || cntW >= 3;
        };
        // 对于 3*3 的矩阵,只需要考虑 4 种情况
        return check(0, 0) || check(0, 1) || check(1, 0) || check(1, 1);
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目2:3128. 直角三角形

思路

套路:有三个顶点,枚举「中间」的直角顶点更容易计算。

设第 i 行有 rows[i] 个 1,第 j 列有 cols[j] 个 1。根据乘法原理,直角顶点为 (i,j) 的直角三角形有 (rows[i] - 1) * (cols[j] - 1) 个,加到答案中。

代码

/*
 * @lc app=leetcode.cn id=3128 lang=cpp
 *
 * [3128] 直角三角形
 */

// @lc code=start
class Solution
{
public:
    long long numberOfRightTriangles(vector<vector<int>> &grid)
    {
        int m = grid.size(), n = m ? grid[0].size() : 0;
        // 每行 1 的个数
        vector<int> rows(m, 0);
        for (int i = 0; i < m; i++)
        {
            int row = 0;
            for (int j = 0; j < n; j++)
                row += grid[i][j];
            rows[i] = row;
        }
        // 每列 1 的个数
        vector<int> cols(n, 0);
        for (int j = 0; j < n; j++)
        {
            int col = 0;
            for (int i = 0; i < m; i++)
                col += grid[i][j];
            cols[j] = col;
        }
        long long ans = 0LL;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                if (grid[i][j] == 1)
                {
                    // 直角顶点为 (i,j) 的直角三角形有 (rows[i] - 1) * (cols[j] - 1) 个
                    ans += (rows[i] - 1) * (cols[j] - 1);
                }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(m*n),其中 m 和 n 分别是矩阵 grid 的行数和列数。

空间复杂度:O(m+n),其中 m 和 n 分别是矩阵 grid 的行数和列数。

题目3:3129. 找出所有稳定的二进制数组 I

思路

记忆化搜索。

dfs(i, j, count) 表示还剩 i 个 0,j 个 1,已经连用 count 个 i 对应的数字的组合数。

边界:dfs(0, 0, count) = 1。

转移为:

  1. 当 count == limit 时,换另一个数字开始计数 dfs(j-1, i, 1)
  2. 当 count < limit 时,为 dfs(i-1, j, count+1) + dfs(j-1, i, 1)

入口:dfs(zero, one, 0)。

代码

/*
 * @lc app=leetcode.cn id=3129 lang=cpp
 *
 * [3129] 找出所有稳定的二进制数组 I
 */

// @lc code=start
class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int numberOfStableArrays(int zero, int one, int limit)
    {
        int mx = max(zero, one);
        int memo[mx + 1][mx + 1][limit + 1];
        memset(memo, -1, sizeof(memo));
        // 还剩 i 个 0,j 个 1,已经连续使用了 count 个 i 对应的数字
        function<int(int, int, int)> dfs = [&](int i, int j, int count) -> int
        {
            if (i < 0 || j < 0)
                return 0;
            if (i == 0 && j == 0)
                return 1;
            int &res = memo[i][j][count];
            if (res != -1)
                return res;
            if (count == limit)
            {
                // 换另一个数字开始计数
                res = dfs(j - 1, i, 1) % MOD;
            }
            else
            {
                // 两种都可以
                res = (dfs(i - 1, j, count + 1) + dfs(j - 1, i, 1)) % MOD;
            }
            return res;
        };
        return dfs(zero, one, 0);
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(zero*one*limit)。

空间复杂度:O(mx2*limit),其中 mx = max(zero, one)。

题目4:3130. 找出所有稳定的二进制数组 II

思路

题解:两种方法:动态规划 / 组合数学(Python/Java/C++/Go)

定义 dfs(i, j, k, limit) 为用 i 个 0,j 个 1 构造稳定数组的方案数,其中第 i+j 个位置要填 k,其中 k 为 0 或 1。

在这里插入图片描述

边界:

在这里插入图片描述

入口:dfs(zero, one, 0, limit) + dfs(zero, one, 1, limit)。

代码

/*
 * @lc app=leetcode.cn id=3130 lang=cpp
 *
 * [3130] 找出所有稳定的二进制数组 II
 */

// @lc code=start
class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int numberOfStableArrays(int zero, int one, int limit)
    {
        int memo[zero + 1][one + 1][2];
        memset(memo, -1, sizeof(memo));
        // 用 i 个 0,j 个 1 构造稳定数组的方案数,其中第 i+j 个位置要填 k
        function<int(int, int, int, int)> dfs = [&](int i, int j, int k, int limit) -> int
        {
            if (i == 0)
            { // 递归边界
                return k == 1 && j <= limit;
            }
            if (j == 0)
            { // 递归边界
                return k == 0 && i <= limit;
            }

            int &res = memo[i][j][k];
            if (res != -1)
                return res;
            if (k == 0)
            {
                res = ((long long)dfs(i - 1, j, 0, limit) + dfs(i - 1, j, 1, limit) +
                       (i > limit ? MOD - dfs(i - limit - 1, j, 1, limit) : 0)) %
                      MOD;
            }
            else
            {
                res = ((long long)dfs(i, j - 1, 0, limit) + dfs(i, j - 1, 1, limit) +
                       (j > limit ? MOD - dfs(i, j - limit - 1, 0, limit) : 0)) %
                      MOD;
            }
            return res;
        };
        return (dfs(zero, one, 0, limit) + dfs(zero, one, 1, limit)) % MOD;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(zero*one)。

空间复杂度:O(zero*one)。

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

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

相关文章

JavaScript异步编程——11-异常处理方案【万字长文,感谢支持】

异常处理方案 在JS开发中&#xff0c;处理异常包括两步&#xff1a;先抛出异常&#xff0c;然后捕获异常。 为什么要做异常处理 异常处理非常重要&#xff0c;至少有以下几个原因&#xff1a; 防止程序报错甚至停止运行&#xff1a;当代码执行过程中发生错误或异常时&#x…

数字人解决方案——ID-Animator可保持角色一致生成视频动画

一、引 言 个性化或自定义生成在图像和视频生成领域是一个不断发展的研究方向&#xff0c;尤其是在创建与特定身份或风格一致的内容方面。您提到的挑战和解决方案为这一领域提供了有价值的见解&#xff1a; 训练成本高&#xff1a;这是一个普遍问题&#xff0c;因为个性化生成…

手机触控面板中应用的电容式触摸芯片

手机触控屏&#xff08;Touch panel&#xff09;又称为触控面板&#xff0c;是个可接收触头等输入讯号的感应式液晶显示装置&#xff0c;当接触了屏幕上的图形按钮时&#xff0c;屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置&#xff0c;可用以取代机械式的按钮面…

【AI】DeepStream(03):deepstream_test1_app

1、简介 deepstream-test1:演示各种 DeepStream 插件构建 GStreamer 管道。从文件中获取视频、解码、批处理,然后进行对象检测,最后在屏幕上渲染框。 源码路径:/opt/nvidia/deepstream/deepstream/sources/apps/sample_apps/deepstream-test1 先看下效果 2、编译 1)…

Redis-分片集群存储及读取数据详解

文章目录 Redis分片集群是什么&#xff1f;Redis分片集群的存储及读取数据&#xff1f; 更多相关内容可查看 Redis分片集群是什么&#xff1f; Redis分片集群是一种分布式部署方式&#xff0c;通过将数据分散存储在多个Redis节点上&#xff0c;从而提高了系统的性能、扩展性和…

【微记录】linux内核态日志如何持续观测?以及dmesg如何显示年月日时间戳?(dmesg -w ; -T)

文章目录 持续观测方法1方法2 dmes显示时间戳 持续观测 方法1 dmesg -w参考&#xff1a;https://man7.org/linux/man-pages/man1/dmesg.1.html 方法2 tail -f /var/log/kern.logdmes显示时间戳 dmesg -T #按照人类可读性高的时间戳 比如2024-05-15 01:20:16实操&#xff1…

快速学习SpringAi

Spring AI是AI工程师的一个应用框架&#xff0c;它提供了一个友好的API和开发AI应用的抽象&#xff0c;旨在简化AI应用的开发工序&#xff0c;例如开发一款基于ChatGPT的对话应用程序。通过使用Spring Ai使我们更简单直接使用chatgpt 1.创建项目 jdk17 引入依赖 2.依赖配置 …

敏捷开发最佳实践:自驱团队实践案例之心情曲线回顾会

调研发现&#xff0c;26%的中国企业认为最有价值管理实践是“团队回顾会”&#xff0c;而“团队回顾会”的确能够很好的引导团队走向自驱。在本节的实践案例中 “心情曲线回顾会”的具体做法较为典型&#xff0c;很值得参考。 本实践节选自《2021中国企业敏捷实践白皮书》&…

压力给到 Google,OpenAI 发布 GPT-4o 来了

北京时间5月14日凌晨1点&#xff0c;OpenAI 开启了今年的第一次直播&#xff0c;根据官方消息&#xff0c;这次旨在演示 ChatGPT 和 GPT-4 的升级内容。在早些时候 Sam Altman 在 X 上已经明确&#xff0c;「我们一直在努力开发一些我们认为人们会喜欢的新东西&#xff0c;对我…

OpenNJet产品体验:探索无限可能

文章目录 前言一、OpenNJet是什么&#xff1f;二、OpenNJet特性和优点三、OpenNJet功能规划四、OpenNJet快速上手五、OpenNJet的使用总结 前言 现代社会网络高速发展&#xff0c;同时也迎来了互联网发展的高峰&#xff0c;OpenNJet作为一个基于NGINX的面向互联网和云原生应用提…

爬虫入门经典(七) | 采集淘宝电场相关信息

大家好&#xff0c;我是不温卜火&#xff0c;昵称来源于成语—不温不火&#xff0c;本意是希望自己性情温和。 PS&#xff1a;由于现在越来越多的人未经本人同意直接爬取博主本人文章&#xff0c;博主在此特别声明&#xff1a;未经本人允许&#xff0c;禁止转载&#xff01;&a…

string功能介绍(普及版)

目录 1。初始化&#xff08;好几种方式&#xff09;&#xff0c;npos和string的使用说明 2。string的拷贝&#xff0c;隐式类型转换&#xff0c;[]&#xff0c;size&#xff0c;iterator&#xff0c;begin&#xff0c;end&#xff0c;reverse&#xff0c;reverse_iterator&am…

【回溯】1240. 铺瓷砖

本文涉及知识点 回溯 LeetCode1240. 铺瓷砖 你是一位施工队的工长&#xff0c;根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m&#xff0c;为保持极简的风格&#xff0c;需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的…

windows驱动开发-PCI和中断(二)

谈到中断使用PCI总线来作为例子是最合适的&#xff0c;在Windows发展过程中&#xff0c;PCI作为最成功的底层总线&#xff0c;集成了大量的外设&#xff0c;不夸张的说&#xff0c;目前PCI几乎是唯一的总线选择&#xff0c;故大部分情况下&#xff0c;只有PCI设备驱动程序会遇到…

前端 performance api使用 —— mark、measure计算vue3页面echarts渲染时间

文章目录 ⭐前言&#x1f496;vue3系列文章 ⭐Performance api计算持续时间&#x1f496; mark用法&#x1f496; measure用法 ⭐计算echarts渲染的持续时间⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享关于 前端 performance api使用 —— mark、measure计…

java springboot连接sqlserver使用

pom.xml增加sqlserver驱动 <dependency><groupId>com.microsoft.sqlserver</groupId><artifactId>mssql-jdbc</artifactId><version>9.4.0.jre8</version></dependency>application.yml配置文件 server:port: 9001 #spring: …

多格式兼容的在线原型查看:Axure RP的便捷解决方案

Axure rp不仅可以绘制详细的产品构思&#xff0c;还可以在浏览器中生成html页面&#xff0c;但需要安装插件才能打开。安装Axure后 rpchrome插件后&#xff0c;还需要在扩展程序中选择“允许访问文件网站”&#xff0c;否则无法在Axure中成功选择 rp在线查看原型。听起来很麻烦…

用友GRP-U8 userInfoWeb SQL注入致RCE漏洞复现 (XVE-2024-10539)

0x01 产品简介 用友GRP-U8R10行政事业内控管理软件是用友公司专注于国家电子政务事业,基于云计算技术所推出的新一代产品,是我国行政事业财务领域最专业的政府财务管理软件。 0x02 漏洞概述 用友GRP-U8R10行政事业内控管理软件 userInfoWeb接口处存在SQL注入漏洞,未授权的…

不懂数字后端Box List、Polygon的意思?

什么是BOX&#xff1f; 景芯SoC做design planning的第一步就是确定floorplan的box&#xff0c;也就是设计的区域。这个区域可以划分为三个边界&#xff0c;如下图所示&#xff1a; Die Box 最外面一圈&#xff0c;我们称为 Die Box&#xff0c;也就是用来放置 IO 单元&#x…

高中数学:平面向量-加减运算

一、向量的加法运算 三角形法则&#xff08;推荐&#xff09; 两个或多个向量收尾相连的加法运算&#xff0c;用三角形法则 简便算法 首尾相连的多个向量&#xff0c;去掉中间点&#xff0c;就是最终的和。 也可以用三角形法则证明 向量加法交换律 向量加法结合律 平行四…