Leetcode 第 413 场周赛题解

news2024/11/15 7:45:18

Leetcode 第 413 场周赛题解

  • Leetcode 第 413 场周赛题解
    • 题目1:3274. 检查棋盘方格颜色是否相同
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3275. 第 K 近障碍物查询
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3276. 选择矩阵中单元格的最大得分
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3277. 查询子数组最大异或值
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 413 场周赛题解

题目1:3274. 检查棋盘方格颜色是否相同

思路

找规律。

根据题目中的图片,如果 coordinate[0] 和 coordinate[1] 的 ASCII 值的奇偶性相同,那么格子是黑格,否则是白格。

进一步地,由于奇数+奇数=偶数,偶数+偶数=偶数,所以如果 (coordinate[0]+coordinate[1]) mod 2 是偶数,那么格子是黑格;否则奇数+偶数=奇数,格子是白格。

如果 (coordinate1[0]+coordinate1[1]) mod 2=(coordinate2[0]+coordinate2[1]) mod 2,那么两个格子颜色相同,否则不同。

代码

/*
 * @lc app=leetcode.cn id=3274 lang=cpp
 *
 * [3274] 检查棋盘方格颜色是否相同
 */

// @lc code=start
class Solution
{
public:
    bool checkTwoChessboards(string coordinate1, string coordinate2)
    {
        return (coordinate1[0] + coordinate1[1]) % 2 == (coordinate2[0] + coordinate2[1]) % 2;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目2:3275. 第 K 近障碍物查询

思路

维护前 k 小元素,可以用最大堆。

遍历数组 queries,计算点 (x,y) 到原点的曼哈顿距离 d=∣x∣+∣y∣。

把 d 入堆,如果堆大小超过 k,就弹出堆顶(最大的元素)。

当堆的大小等于 k 时,堆顶就是第 k 小的距离。

代码

/*
 * @lc app=leetcode.cn id=3275 lang=cpp
 *
 * [3275] 第 K 近障碍物查询
 */

// @lc code=start
class Solution
{
public:
    vector<int> resultsArray(vector<vector<int>> &queries, int k)
    {
        int n = queries.size();
        vector<int> ans(n, -1);
        priority_queue<int> pq; // 大根堆
        for (int i = 0; i < n; i++)
        {
            int dis = abs(queries[i][0]) + abs(queries[i][1]);
            pq.push(dis);
            if (pq.size() > k)
                pq.pop();
            if (pq.size() == k)
            {
                // 堆顶就是当前第 k 小的距离
                ans[i] = pq.top();
            }
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(mlogk),其中 m 是数组 queries 的长度。单次插入的时间复杂度是O(logk)。

空间复杂度:O(k)。返回值不计入。

题目3:3276. 选择矩阵中单元格的最大得分

思路

用回溯会超时:

/*
 * @lc app=leetcode.cn id=3276 lang=cpp
 *
 * [3276] 选择矩阵中单元格的最大得分
 */

// @lc code=start
class Solution
{
private:
    int m, n;
    int ans = 0;

public:
    int maxScore(vector<vector<int>> &grid)
    {
        m = grid.size(), n = m ? grid[0].size() : 0;
        unordered_set<int> s;
        backtrace(0, 0, s, grid);
        return ans;
    }
    // 辅函数 - 回溯
    void backtrace(int level, int score, unordered_set<int> s, vector<vector<int>> &grid)
    {
        if (level == m)
        {
            ans = max(ans, score);
            return;
        }
        for (int j = 0; j < n; j++)
        {
            if (s.count(grid[level][j]) == 0)
            {
                s.insert(grid[level][j]);
                score += grid[level][j];
                backtrace(level + 1, score, s, grid);
                score -= grid[level][j];
                s.erase(grid[level][j]);
                backtrace(level + 1, score, s, grid);
            }
        }
    }
};
// @lc code=end

在这里插入图片描述

用状压 DP。

定义状态为 dp[i][j],表示在 [1,i] 中选数字,所选数字所处的行号不能在集合 j 中,每行至多一个数且没有相同元素时,所选元素之和的最大值。

讨论元素 i 选或不选:

  • 不选 i,问题变成在 [1,i−1] 中选数字,所选数字所处的行号不能在集合 j 中,每行至多一个数且没有相同元素时,所选元素之和的最大值,即 dp[i-1][j]。
  • 选 i,枚举选第 k 行的 i(提前预处理 i 所处的行号),问题变成在 [1,i−1] 中选数字(注意 i 只能选一次),所选数字所处的行号不能在集合 j∪{k} 中,每行至多一个数且没有相同元素时,所选元素之和的最大值,即 dp[i-1][j∪{k}]。

两种情况取最大值。

代码

// 状压 DP

class Solution
{
public:
    int maxScore(vector<vector<int>> &grid)
    {
        int m = grid.size();
        unordered_map<int, int> pos;
        for (int i = 0; i < m; i++)
        {
            for (int &x : grid[i])
            {
                // 保存所有包含 x 的行号(压缩成二进制数)
                pos[x] |= 1 << i;
            }
        }

        vector<int> all_nums;
        for (auto &[x, _] : pos)
        {
            all_nums.push_back(x);
        }

        int u = 1 << m;
        vector<vector<int>> dp(all_nums.size() + 1, vector<int>(u));
        for (int i = 0; i < all_nums.size(); i++)
        {
            int x = all_nums[i];
            for (int j = 0; j < u; j++)
            {
                dp[i + 1][j] = dp[i][j]; // 不选 x
                for (int t = pos[x], lb; t; t ^= lb)
                {
                    lb = t & -t;       // lb = 1<<k,其中 k 是行号
                    if ((j & lb) == 0) // 没选过第 k 行的数
                    {
                        dp[i + 1][j] = max(dp[i + 1][j], dp[i][j | lb] + x); // 选第 k 行的 x
                    }
                }
            }
        }
        return dp.back()[0];
    }
};

复杂度分析

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

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

题目4:3277. 查询子数组最大异或值

思路

考虑数组的异或值(最后剩下的元素)是由哪些元素异或得到的。

例如数组为 [a,b,c],那么操作一次后变成 [a⊕b, b⊕c],再操作一次,得到 a⊕b⊕b⊕c。其中 b 异或了 2 次。

为方便描述,下面把 a⊕b 简记为 ab,把 a⊕b⊕b⊕c 简记为 ab2c。

又例如数组为 [a,b,c,d],那么操作一次后变成 [ab,bc,cd],再操作一次,变成 [ab2c,bc2d],再操作一次,得到 ab3c3d。

可以发现,ab3c3d 相当于数组 [a,b,c] 的异或值,再异或 [b,c,d] 的异或值。

第一个区间 DP:

定义 dp[i][j] 表示下标从 i 到 j 的子数组的「数组的异或值」,根据上面的讨论,有 dp[i][j]=dp[i][j−1]⊕dp[i+1][j]。

初始值:dp[i][i]=nums[i]。

第二个区间 DP:

为了回答询问,我们需要计算下标从 i 到 j 的子数组中的所有子数组的 f 值的最大值,将其记作 mx[i][j]。

分类讨论:

  • 取 dp[i][j] 作为最大值。
  • 最大值对应的子数组,右端点不是 j,那么问题变成下标从 i 到 j−1 的子数组中的所有子数组的 dp 值的最大值,即 mx[i][j−1]。
  • 最大值对应的子数组,左端点不是 i,那么问题变成下标从 i+1 到 j 的子数组中的所有子数组的 dp 值的最大值,即 mx[i+1][j]。

三者取最大值,得 mx[i][j]=max(dp[i][j],mx[i][j−1],mx[i+1][j])。

初始值:mx[i][i]=nums[i]。

回答询问时直接查询 mx 数组。

代码

/*
 * @lc app=leetcode.cn id=3277 lang=cpp
 *
 * [3277] 查询子数组最大异或值
 */

// @lc code=start
class Solution
{
public:
    vector<int> maximumSubarrayXor(vector<int> &nums, vector<vector<int>> &queries)
    {
        int n = nums.size();
        vector<vector<int>> dp(n, vector<int>(n));
        vector<vector<int>> mx(n, vector<int>(n));
        // 初始化
        for (int i = 0; i < n; i++)
        {
            dp[i][i] = nums[i];
            mx[i][i] = nums[i];
        }
        // 状态转移
        for (int i = n - 1; i >= 0; i--)
            for (int j = i + 1; j < n; j++)
            {
                dp[i][j] = dp[i][j - 1] ^ dp[i + 1][j];
                mx[i][j] = max(dp[i][j], max(mx[i + 1][j], mx[i][j - 1]));
            }

        vector<int> ans;
        for (vector<int> &q : queries)
            ans.push_back(mx[q[0]][q[1]]);

        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n2+q),其中 n 是数组 nums 的长度,q 是数组 queries 的长度。

空间复杂度:O(n2),其中 n 是数组 nums 的长度。

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

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

相关文章

【SpringCloud】Spring Cloud 开发环境搭建与基础工程构建

目录 环境和工程搭建开发环境安装JDKJDK版本介绍JDK17安装WindowsLinux - UbuntuLinux - CentOs MySQL安装UbuntuCentOS 案例介绍需求服务拆分服务拆分原则服务拆分示例 数据准备工程搭建构建父子工程创建父工程DependencyManagement 和 DependenciesSpring Cloud版本 创建子项…

【生日视频制作】奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字软件一键生成器教程特效素材【AE模板】

生日视频制作教程奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字特效广告生成神器素材祝福玩法AE模板工程 AE模板套用改图文教程↓↓&#xff1a; 怎么如何做的【生日视频制作】奔驰梅赛德斯大奔提车交车仪式感视频拍照AE模板修改文字软件一键生成器教程特效素材【AE模…

下一代 AI 搜索:多智能体 + 系统2,解决 AI 搜索在复杂信息性能下降问题

下一代 AI 搜索&#xff1a;多智能体 系统2&#xff0c;解决 AI 搜索在复杂信息性能下降问题 AI 搜索&#xff1a;从搜索引擎到答案引擎① AI 搜索市场现状&#xff08;可跳过&#xff09;② 巨好用的 AI 工具推荐程序员的垂直搜索引擎 devv.ai ③ 多智能体 系统2&#xff0c…

易扫功能介绍

背景 之前开发扫描工具&#xff0c;在大家使用过程中提出了很多改进建议&#xff0c;其中最多的就是&#xff0c;IP地址变动&#xff0c;导致无法扫描。易扫软件系统解决了这个问题&#xff0c;同时易扫服务端&#xff0c;支持多操作系统平台安装。 系统架构 主要功能介绍 支…

字典+泛型的栈与队列+委托

字典 在System.Collections.Generic下&#xff0c;对应HashTable,添加了泛型的特性&#xff0c;性能更高更安全&#xff0c;在内存中散列排布&#xff0c;存储也是键值对。 Dictionary<键的数据类型&#xff0c;值的数据类型> 字典名new Dictionary<键的数据类型&am…

18063 圈中的游戏

### 思路 1. 创建一个循环链表表示围成一圈的 n 个人。 2. 从第一个人开始报数&#xff0c;每报到 3 的人退出圈子。 3. 重复上述过程&#xff0c;直到只剩下一个人。 4. 输出最后留下的人的编号。 ### 伪代码 1. 创建一个循环链表&#xff0c;节点表示每个人的编号。 2. 初始…

【视觉中国-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

TCP Analysis Flags 之 TCP ZeroWindow

前言 默认情况下&#xff0c;Wireshark 的 TCP 解析器会跟踪每个 TCP 会话的状态&#xff0c;并在检测到问题或潜在问题时提供额外的信息。在第一次打开捕获文件时&#xff0c;会对每个 TCP 数据包进行一次分析&#xff0c;数据包按照它们在数据包列表中出现的顺序进行处理。可…

9. 什么是 Beam Search?深入理解模型生成策略

是不是总感觉很熟悉&#xff1f; 在之前第5&#xff0c;7&#xff0c;8篇文章中&#xff0c;我们都曾经用到过与它相关的参数&#xff0c;而对于早就有着实操经验的同学们&#xff0c;想必见到的更多。这篇文章将从示例到数学原理和代码带你进行理解。 Beam Search 对应的中文翻…

工厂模式(一):简单工厂模式

一、概念 顾名思义&#xff0c;带着工厂&#xff0c;两字肯定就是有标准、快速、统一等等一些工厂独有的特点。 那么什么是简单工厂模式呢&#xff1f; 定义&#xff1a;简单工厂模式是一种创建对象的设计模式&#xff0c;它定义了一个工厂类通过某个静态方法来生成不同类型的…

基于AutoDL部署langchain-chatchat-0.3.1实战

一、租用AutoDL云服务器&#xff0c;配置环境 1.1 配置AutoDL环境 注册好autodl账户之后&#xff0c;开始在上面租服务器&#xff0c;GPU我选择的是RTX4090*2&#xff0c;西北B区&#xff0c;基础镜像选择的是Pytorch-2.3.0-python-3.12&#xff08;ubuntu22.04&#xff09;-…

夸克网盘电脑端和手机端如何查看自己分享的文件

夸克网盘有些地方做的还是有点抽象&#xff0c;好多东西是真的找不到。 找了半天终于找到了自己分享的文件&#xff0c;给大家分享下。 电脑端 点击左侧栏的“快传”&#xff0c;然后点击“我分享的” 手机端 手机端也是类似&#xff0c;点击“快传”后再点击“我分享的”&a…

白月光git

感觉bug好多干脆直接从头到脚梳理 感冒不嘻嘻 近况是&#xff1a; 早起学习 开车去沟里 把蜜蜂拍到狗身上 把车开回来 吃席 安装git和VScode 都是从官网上装的&#xff0c;不说那么多咯&#xff0c;之前说过&#xff1a; 进程间也要唠一唠-CSDN博客https://blog.csdn.net…

Spring4-IoC3-手写IoC

Spring框架的IoC是基于Java反射机制实现的 Java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意方法和属性&#xff0c;这种动态获取信息以及动态调用对象方法的功…

【AI学习笔记】初学机器学习西瓜书的知识点概要记录

初学机器学习西瓜书的知识点概要记录 1.1 机器学习1.2 典型的机器学习过程1.2 机器学习理论1.3 基本术语1.4 归纳偏好1.5 NFL定理2.1 泛化能力2.2 过拟合和欠拟合2.3 三大问题2.4 评估方法2.5 调参与验证集2.6 性能度量2.7 比较检验 以下内容出自周志华老师亲讲西瓜书 1.1 机器…

复习:数组

目录 数组名 一般性理解 下标引用与间接访问 例外 一维数组 声明与初始化 下标引用 内存分配 长度计算 二维数组 内存分配 长度计算 声明与初始化 数组指针 引入 数组指针 一级指针 引入 一级指针 章尾问题 数组名 一般性理解 数组名是一个指向&#x…

DockerLinux安装DockerDocker基础

Linux软件安装 yum命令安装 通过yum命令安装软件,是直接把软件安装到Linux系统中 安装和卸载都比较麻烦,因为软件和系统是强关联的 Docker docker是一种容器技术,可以解决软件和系统强关联关系,使得软件的安装和卸载更方便,它可以将我们的应用以及依赖进行打包,制作出一个镜…

算法:TopK问题

题目 有10亿个数字&#xff0c;需要找出其中的前k大个数字。 为了方便讲解&#xff0c;这里令k为5。 思路分析&#xff08;以找前k大个数字为例&#xff09; 很容易想到&#xff0c;进行排序&#xff0c;然后取前k个数字即可。 但是&#xff0c;难点在于&#xff0c;10亿个数…

人工智能GPT____豆包使用的一些初步探索步骤 体验不一样的工作

豆包工具是我使用比较频繁的一款软件&#xff0c;其集合了很多功能。对话 图像 AI搜索 伴读等等使用都非常不错。电脑端安装集合了很多功能。 官网直达&#xff1a;豆包 使用我的文案创作能力&#xff0c;您可以注意以下几个技巧&#xff1a; 明确需求&#xff1a; 尽可能具…

Linux进阶 把用户加入和移除用户组

1、Linux 单用户多任务,多用户多任务概念 Linux 是一个多用户、多任务的操作系统。 单用户多任务、多用户多任务 概念; Linux 的 单用户、多任务以 beinan 登录系统,进入系统后,我要打开gedit 来写文档,但在写文档的过程中,我感觉少点音乐,所以又打开xmms 来点音乐;当…