Leetcode 第 369 场周赛题解

news2024/12/24 8:35:15

Leetcode 第 369 场周赛题解

  • Leetcode 第 369 场周赛题解
    • 题目1:2917. 找出数组中的 K-or 值
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2918. 数组的最小相等和
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2919. 使数组变美的最小增量运算数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2920. 收集所有金币可获得的最大积分
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 369 场周赛题解

在这里插入图片描述

题目1:2917. 找出数组中的 K-or 值

思路

模拟。

枚举每个比特位,遍历数组,如果第 i 个比特位上的 1 的个数 ≥ k,则把 2i 加到答案中。

代码

/*
 * @lc app=leetcode.cn id=2917 lang=cpp
 *
 * [2917] 找出数组中的 K-or 值
 */

// @lc code=start
class Solution
{
public:
    int findKOr(vector<int> &nums, int k)
    {
        int k_or = 0;
        for (int i = 0; i < 32; i++)
        {
            int count = 0;
            for (const int &num : nums)
                if (num & (1 << i))
                    count++;
            if (count >= k)
                k_or += (1 << i);
        }
        return k_or;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogU),其中 n 为数组 nums 的长度,U=max⁡(nums)。

空间复杂度:O(1)。

题目2:2918. 数组的最小相等和

思路

贪心。

设数组 nums1 的元素总和为 sum1,其中 0 的个数为 countZero1;数组 nums2 的元素总和为 sum2,其中 0 的个数为 countZero2。

题目要求我们必须将两个数组中的 所有 0 替换为严格正整数,并且满足两个数组中所有元素的和相等 。

最后返回最小相等和 ,如果无法使两数组相等,则返回 -1 。

基于贪心的思想,把所有的 0 改成 1,所有元素的和为最小。于是,数组 nums1 的最小和为 sum1 + countZero1,数组 nums2 的最小和为 sum2 + countZero2。

分类讨论:

  • 如果 sum1 < sum2 + countZero2 && countZero1 == 0,说明无法将数组 nums1 修改到和修改后的数组 nums2 的和相等,返回 -1。
  • 如果 sum2 < sum1 + countZero1 && countZero2 == 0,说明无法将数组 nums2 修改到和修改后的数组 nums1 的和相等,返回 -1。
  • 其他情况,都能得到最小相等和。最小相等和为两个最小和的较大值,即 max(sum1 + countZero1, sum2 + countZero2)。

代码

/*
 * @lc app=leetcode.cn id=2918 lang=cpp
 *
 * [2918] 数组的最小相等和
 */

// @lc code=start
class Solution
{
public:
    long long minSum(vector<int> &nums1, vector<int> &nums2)
    {
        long long sum1 = 0, sum2 = 0;
        int countZero1 = 0, countZero2 = 0;
        for (const int num : nums1)
        {
            if (num)
                sum1 += num;
            else
                countZero1++;
        }
        for (const int num : nums2)
        {
            if (num)
                sum2 += num;
            else
                countZero2++;
        }
        if (sum1 < sum2 + countZero2 && countZero1 == 0)
            return -1;
        if (sum2 < sum1 + countZero1 && countZero2 == 0)
            return -1;
        return max(sum1 + countZero1, sum2 + countZero2);
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n+m),其中 n 为数组 nums1 的长度,m 为数组 nums2 的长度。

空间复杂度:O(1)。

题目3:2919. 使数组变美的最小增量运算数

思路

动态规划。

把大于 k 的元素视作 k。

由于大于 3 的子数组必然包含等于 3 的子数组,问题转换成:每个长为 3 的子数组都需要包含至少一个 k。

设 dp[i] 表示表示修改第 i 项并使前 i 项变为美丽数组的最小修改次数。

初始化时,dp[0] = max(0, k - nums[0])dp[1] = max(0, k - nums[1])dp[2] = max(0, k - nums[2])

状态转移方程:

dp[i] = min{dp[i−3], dp[i−2], dp[i−1]} + max{0,  k−nums[i]}

使原数组变为美丽数组的最小修改次数 ans = min{dp[n−3], dp[n−2], dp[n−1]}

代码

/*
 * @lc app=leetcode.cn id=2919 lang=cpp
 *
 * [2919] 使数组变美的最小增量运算数
 */

// @lc code=start
class Solution
{
public:
    long long minIncrementOperations(vector<int> &nums, int k)
    {
        int n = nums.size();
        // dp[i] 表示表示修改第 i 项并使前 i 项变为美丽数组的最小修改次数
        vector<long long> dp(n, 0);
        // 初始化
        for (int i = 0; i < 3; i++)
            dp[i] = max(0, k - nums[i]);
        // 状态转移
        for (int i = 3; i < n; i++)
        {
            // 状态转移方程
            dp[i] = min(dp[i - 3], min(dp[i - 2], dp[i - 1])) + max(0, k - nums[i]);
        }
        return min(dp[n - 3], min(dp[n - 2], dp[n - 1]));
    }
};
// @lc code=end

复杂度分析

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

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

题目4:2920. 收集所有金币可获得的最大积分

思路

树型 DP。

题解:树 DP

代码

/*
 * @lc app=leetcode.cn id=2920 lang=cpp
 *
 * [2920] 收集所有金币可获得的最大积分
 */

// @lc code=start
class Solution
{
public:
    int maximumPoints(vector<vector<int>> &edges, vector<int> &coins, int K)
    {
        int n = coins.size();
        const int MAXP = 20;

        // 建图
        vector<int> e[n];
        for (auto &edge : edges)
        {
            e[edge[0]].push_back(edge[1]);
            e[edge[1]].push_back(edge[0]);
        }

        const long long INF = 1e18;
        long long f[n][MAXP][2];
        for (int i = 0; i < n; i++)
            for (int j = 0; j < MAXP; j++)
                f[i][j][0] = f[i][j][1] = -INF;
        // 树 dp
        function<void(int, int)> dp = [&](int sn, int fa)
        {
            long long now = coins[sn];
            for (int j = 0; j < MAXP; j++)
            {
                f[sn][j][0] = now - K;
                if (j > 0)
                    f[sn][j][1] = now;
                now >>= 1;
            }
            // 枚举子节点的操作
            for (int fn : e[sn])
                if (fn != fa)
                {
                    dp(fn, sn);
                    for (int j = 0; j < MAXP; j++)
                    {
                        // 这里的 min 是因为我们只考虑 log 次操作
                        long long best = max(f[fn][j][0], f[fn][min(MAXP - 1, j + 1)][1]);
                        f[sn][j][0] += best;
                        f[sn][j][1] += best;
                    }
                }
        };
        dp(0, -1);

        long long ans = 0;
        for (int j = 0; j < MAXP; j++)
            ans = max({ans, f[0][j][0], f[0][j][1]});
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogU),其中 n 为 coins 的长度,U=max⁡(coins)。

空间复杂度:O(nlog⁡U)。

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

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

相关文章

合并两个有序链表OJ

合并两个有序链表OJ 文章目录 合并两个有序链表OJ一、题目及要求二、思路分析三、代码实现 一、题目及要求 二、思路分析 其次&#xff0c;题目里说了新链表是通过拼接原来的结点形成的&#xff0c;所以说我们不需要开辟新的空间。 三、代码实现 if (list1 NULL) {return li…

在字节4年,一个27岁女软件测试工程师的心路历程

个人经验分享 简单的先说一下&#xff0c;坐标深圳&#xff0c;18届本科毕业&#xff0c;算上在字节的面试&#xff0c;一共有面试了5家公司&#xff08;不想请假&#xff0c;所以只是每个晚上去其他公司面试&#xff0c;面试的公司就比较少&#xff09; 其中面试成功的有3家&…

vue基础知识十八:说说你对keep-alive的理解是什么?

一、Keep-alive 是什么 keep-alive是vue中的内置组件&#xff0c;能在组件切换过程中将状态保留在内存中&#xff0c;防止重复渲染DOM keep-alive 包裹动态组件时&#xff0c;会缓存不活动的组件实例&#xff0c;而不是销毁它们 keep-alive可以设置以下props属性&#xff1a…

js各种简单事件处理(整理)

**## 获取当天昨天日期** // 当天日期 const today new Date();// 格式化当天日期为 YYYY-MM-DD 格式 const formattedToday today.toISOString().slice(0, 10);// 昨天日期 const yesterday new Date(); yesterday.setDate(yesterday.getDate() - 1);// 格式化昨天日期为 Y…

2023年11月在线IDE流行度最新排名

点击查看最新在线IDE流行度最新排名&#xff08;每月更新&#xff09; 2023年11月在线IDE流行度最新排名 TOP 在线IDE排名是通过分析在线ide名称在谷歌上被搜索的频率而创建的 在线IDE被搜索的次数越多&#xff0c;人们就会认为它越受欢迎。原始数据来自谷歌Trends 如果您相…

广和通5G模组FM650助力阿里云打造无影魔方Pro

随着云基础设施的完善及云电脑体验的不断优化&#xff0c;越来越多的个人和企业选择无影云电脑进行办公。基于云原生的云网端技术架构&#xff0c;无影云电脑相比传统PC&#xff0c;具有弹性、安全、保障个人数据等产品优势。 10月31日&#xff0c;阿里云在杭州云栖大会上宣布…

易货:一种古老而新颖的交易方式

在当今快速发展的经济环境中&#xff0c;易货模式正逐渐引起人们的关注。这种古老而新颖的交易方式&#xff0c;不仅为企业提供了新的商业机会&#xff0c;还为消费者带来了更多的选择。本文将详细介绍易货模式的概念、优势以及如何实现易货交易&#xff0c;并探讨这种模式未来…

精解括号匹配问题与极致栈设计:揭开最大栈和最小栈的奥秘

目录 括号匹配问题最小栈最大栈 最大栈和最小栈是极致栈的两个重要变种。最大栈用于存储当前匹配的最大值&#xff0c;而最小栈用于存储当前匹配的最小值。 括号匹配问题 这个问题我们来看力扣20题的描述&#xff1a; 给定一个只包括 ‘(’&#xff0c;‘)’&#xff0c;‘{’…

如何修改文件的修改日期?

如何修改文件的修改日期&#xff1f;文件的修改日期指的是文件最近一次被修改的日期和时间。当文件内容被修改、编辑或更新时&#xff0c;系统会自动更新文件的修改日期。这个日期记录了文件内容的实际修改时间&#xff0c;可以帮助用户了解文件的更新情况以及文件版本的管理。…

[云原生案例2.2 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】网络插件部分

文章目录 1. Kubernetes的网络类别2. Kubernetes的接口类型3. CNI网络插件 ---- Flannel的介绍及部署3.1 简介3.2 flannel的三种模式3.3 flannel的UDP模式工作原理3.4 flannel的VXLAN模式工作原理3.5 Flannel CNI 网络插件部署3.5.1 上传flannel镜像文件和插件包到node节点3.5.…

2023年度API安全状况详解

随着云计算和移动应用的快速发展&#xff0c;API&#xff08;应用程序接口&#xff09;已成为不可或缺的技术组成部分。然而&#xff0c;API的广泛使用也带来了安全风险。本文将探讨2023年的API安全状况&#xff0c;并介绍了一些应对这些安全挑战的最佳实践。 引言 随着全球互联…

改进YOLOv5:结合ICCV2023|动态蛇形卷积,构建不规则目标识别网络

🔥🔥🔥 提升多尺度、不规则目标检测,创新提升 🔥🔥🔥 🔥🔥🔥 捕捉图像特征和处理复杂图像特征 🔥🔥🔥 👉👉👉: 本专栏包含大量的新设计的创新想法,包含详细的代码和说明,具备有效的创新组合,可以有效应用到改进创新当中 👉👉👉: �…

安装ubuntu-20.04.6-desktop版本、根据ISO文件制作U盘启动盘

前言 本文简述&#xff0c;安装Ubuntu20.04.6的过程&#xff0c;包括制作U盘启动盘、安装。 下载Ubuntu镜像 去官网下载桌面版ubuntu-20.04.6镜像&#xff0c;下载完后文件名是ubuntu-20.04.6-desktop-amd64.iso&#xff0c;这里有个问题amd64.iso能安装在intel处理器的电脑…

计算机网络学习笔记(五):运输层(待更新)

5.1 概述 5.1.1 TCP协议的应用场景 TCP为应用层协议提供可靠传输&#xff0c;发送端按顺序发送&#xff0c;接收端按顺序接收&#xff0c;其间发送丢包、乱序&#xff0c;TCP负责重传和排序。下面是TCP的应用场景。 多次交互&#xff1a;客户端程序和服务端程序需要多次交互才…

ai实景直播矩阵式引流---技术开发搭建(剪辑、矩阵、直播)

目前我们的短视频矩阵剪辑分发系统更新&#xff1a; 无人直播更新&#xff1a; 1、新增文案引流&#xff1a;已接入混元数据大模型&#xff0c;千帆数据大模型&#xff0c;星火数据大模型&#xff0c;盘古数据大模型&#xff0c;通义数据大模型&#xff0c;ChatGPT数据大模型…

muduo源码剖析之TimerQueue类

简介 TimerQueue ​ 通过timerfd实现的定时器功能&#xff0c;为EventLoop扩展了一系列runAt&#xff0c;runEvery&#xff0c;runEvery等函数TimerQueue中通过std::set维护所有的Timer&#xff0c;也可以使用优先队列实现 muduo的TimerQueue是基于timerfd_create实现&#…

Jupyter Notebook 内核似乎挂掉了,它很快将自动重启

报错原因&#xff1a; OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized. OMP: Hint This means that multiple copies of the OpenMP runtime have been linked into the program. That is dangerous, since it can degrade perfo…

AD教程 (十)Value值的核对

AD教程 &#xff08;十&#xff09;Value值的核对 填写器件位号 直接根据原理图的原始编号进行更改 通过位号编辑器快速更改 点击工具&#xff0c;选择标注&#xff0c;选择原理图标注&#xff0c;进入位号编辑器 可以在位号编辑器中 设置处理顺序&#xff0c;从上往下还是从…

推荐一款网络拓扑自动扫描工具

topology-scanner Topology-Scanner是WeOps团队免费开放的一个网络拓扑自动扫描模块&#xff0c;可以自动发现网络设备的类型、网络设备之间的互联 资源下载地址&#xff1a;https://download.csdn.net/download/XMWS_IT/88510697 或 加 薇|信|号吗&#xff1a;xmws-IT 免…

C嘎嘎之类和对象下

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解顺序表和链表的利弊&#xff0c;能在不同的题…