Leetcode 第 360 场周赛题解

news2024/11/18 1:42:46

Leetcode 第 360 场周赛题解

  • Leetcode 第 360 场周赛题解
    • 题目1:2833. 距离原点最远的点
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2834. 找出美丽数组的最小和
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2835. 使子序列的和等于目标的最少操作次数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:

Leetcode 第 360 场周赛题解

题目1:2833. 距离原点最远的点

思路

贪心。

要使得到达的距离原点最远的点,就看 left 和 right 谁大,将 left 和 right 作为矢量相加,再往同方向加上 underline。

答案即为 abs(left - right) + underline。

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=2833 lang=cpp
 *
 * [2833] 距离原点最远的点
 */

// @lc code=start
class Solution
{
public:
    int furthestDistanceFromOrigin(string moves)
    {
        int left = 0, right = 0, underline = 0;
        for (char &c : moves)
        {
            if (c == 'L')
                left++;
            else if (c == 'R')
                right++;
            else
                underline++;
        }
        return abs(left - right) + underline;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 moves 的长度。

空间复杂度:O(1)。

题目2:2834. 找出美丽数组的最小和

思路

贪心。

从最小正整数 1 开始枚举,设当前数为 num,如果 nums 里没有 target - num,就说明可以添加 num,依次填满直到有 n 个数即可。

用集合 nums 存储数据保证唯一性。

class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int minimumPossibleSum(int n, int target)
    {
        set<int> nums;
        nums.insert(1);
        int num = 2;
        while (nums.size() < n)
        {
            if (!nums.count(target - num))
                nums.insert(num);
            num++;
        }
        return accumulate(nums.begin(), nums.end(), 0LL) % MOD;
    }
};

结果超时了:

在这里插入图片描述

我们发现了规律,对于 [1, target−1] 内的数字:

  1. 1 和 target-1 只能选其中一个,为了使美丽数组的总和最小,我们选1。
  2. 2 和 target-2 只能选其中一个,为了使美丽数组的总和最小,我们选2。
  3. 一直到 ⌊target/2⌋,无论 target 是奇数还是偶数,它都可以选。

设 m = min(n, ⌊target/2⌋),我们选择1~m,总和为 m(m+1)/2。

此时还剩下 n-m个数,只能从 target 开始往后选,一直到 target+n-m-1。

代码

/*
 * @lc app=leetcode.cn id=2834 lang=cpp
 *
 * [2834] 找出美丽数组的最小和
 */

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

// public:
//     int minimumPossibleSum(int n, int target)
//     {
//         set<int> nums;
//         nums.insert(1);
//         int num = 2;
//         while (nums.size() < n)
//         {
//             if (!nums.count(target - num))
//                 nums.insert(num);
//             num++;
//         }
//         return accumulate(nums.begin(), nums.end(), 0LL) % MOD;
//     }
// };

class Solution
{
private:
    const int MOD = 1e9 + 7;

public:
    int minimumPossibleSum(int n, int target)
    {
        long long m = min(target / 2, n);
        return (cal(1, m) + cal(target, target + n - m - 1)) % MOD;
    }
    // 辅函数 - 返回 [left, right] 区间内元素和
    long long cal(int left, int right)
    {
        long long sum = 0;
        for (int i = left; i <= right; i++)
            sum += i;
        return sum;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(1)。

空间复杂度:O(1)。

题目3:2835. 使子序列的和等于目标的最少操作次数

思路

贪心。

因为每个数最终都能拆成 1,只有当 sum(nums) < target 时才会无解,返回 -1。

剩下的都是有解的情况:

枚举 target 所有为 1 二进制位 i,令 x = 1 << i。

  1. 先看 nums 中所有小于 x 的数之和是否大于等于 x,如果是,我们可以用这些数拼出一个 x,那么这个二进制位可以跳过。
  2. 否则看 nums 里是否恰好有 x,如果是,那么这个二进制位也可以跳过。
  3. 否则只能看 nums 里下一个比 x 大的数,执行若干次操作,拆分得到 x。

贪心的思想体现在:只看 nums 里下一个比 x 大的数,这样的数最接近 x,可以用最少的操作拆分得到 x。

从 target 的低位到高位贪心,将数组 nums 从大到小排序,先消耗较小的元素,拆分得到的数一定比原来的数要小,而且是以递减的顺序添加的,直接插入数组的末尾,不会改变数组递减的性质。

小细节:在y > x那里,为什么每次只push一个y呢,按理说会拆成两个。这是因为一个拆成两个一个会添加到原来的数组中,另一个要么等于x,被使用,要么大于x,要继续被拆,本次不会被添加到原有的数组中。

代码

/*
 * @lc app=leetcode.cn id=2835 lang=cpp
 *
 * [2835] 使子序列的和等于目标的最少操作次数
 */

// @lc code=start
class Solution
{
public:
    int minOperations(vector<int> &nums, int target)
    {
        // 排除无解的情况
        if (accumulate(nums.begin(), nums.end(), 0LL) < target)
            return -1;
        // nums 从大到小排序
        sort(nums.begin(), nums.end(), greater<int>());
        int step = 0;
        // t 表示比当前二进制位小的所有数之和
        long long t = 0;
        for (int i = 0; i < 32; i++)
        {
            // 如果 target 的第 i 位是 1
            if (target >> i & 01)
            {
                int x = 1 << i;
                // 不断把比当前二进制位小的数加到 t 里
                while (!nums.empty() && nums.back() < x && t < x)
                {
                    t += nums.back();
                    nums.pop_back();
                }
                // 比当前二进制位小的数之和已经大于等于当前二进制位,这一位不用操作
                if (t >= x)
                    t -= x;
                // 刚好找到需要的数,也不用操作
                else if (nums.back() == x)
                    nums.pop_back();
                else
                {
                    // 看下一个更大的数,用它拆出当前二进制位
                    int y = nums.back();
                    nums.pop_back();
                    while (y > x)
                    {
                        y >>= 1;
                        // 注意:只有这里会往 nums 的尾部添加数
                        // 由于添加的数都小于原来的尾部,而且是以递减的顺序添加的
                        // 所以 nums 递减的性质不改变
                        nums.push_back(y);
                        step++;
                    }
                }
            }
        }
        return step;
    }
};
// @lc code=end

复杂度分析

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

空间复杂度:O(log(target))。

题目4:

超出能力范围。

题解:【模板】树上倍增(Python/Java/C++/Go)

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

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

相关文章

使用GoogleNet网络实现花朵分类

一.数据集准备 新建一个项目文件夹GoogleNet&#xff0c;并在里面建立data_set文件夹用来保存数据集&#xff0c;在data_set文件夹下创建新文件夹"flower_data"&#xff0c;点击链接下载花分类数据集https://storage.googleapis.com/download.tensorflow.org/exampl…

基于TLS的抓包内容分析解决方法

https网络包传输过程中经SSL/TSL加密后&#xff0c;在协议分析工具中&#xff08;如wireshark&#xff09;对于应用层http内容数据无法分析。要解决这个问题&#xff0c;可以参考以下2种方法&#xff0c; &#xff08;1&#xff09;配置SSLKEYLOGFILE环境变量配置wireshark TLS…

由浅入深学习nginx

nginx&#xff08;高性能的http和反向代理服务器&#xff09;的优点&#xff1a; &#xff08;1&#xff09;占有内存少 &#xff08;2&#xff09;并发能力强&#xff08;支持5万个&#xff09; &#xff08;3&#xff09;专为性能优化而开发 nginx主要可以实现的功能有这么几…

FL Studio2024破解版激活码许可证

fl studio 21中文版具备直观的界面和强大的编辑功能&#xff0c;使您能够轻松地调整和精确控制音频轨道。您可以实时录制、编辑和处理多个音轨&#xff0c;轻松实现混音和编曲。无论您是专业音乐制作人还是初学者&#xff0c;都能满足您的需求&#xff0c;并帮助您实现创作梦想…

正则表达式[总结]

文章目录 1. 为什么要学习正则表达式2. 再提出几个问题&#xff1f;3. 解决之道-正则表达式4. 正则表达式基本介绍5. 正则表达式底层实现(重要)6. 正则表达式语法6.1 基本介绍6.2 元字符(Metacharacter)-转义号 \\\6.3 元字符-字符匹配符6.4 元字符-选择匹配符6.5 元字符-限定符…

Git学习笔记——超详细

Git笔记 安装git&#xff1a; apt install git 创建版本库&#xff1a; git init 添加文件到版本库&#xff1a; git add 文件 提交文件到仓库&#xff1a; git commit -m “注释” 查看仓库当前的状态信息&#xff1a; git status 查看修改内容和之前版本的区别&am…

抖音热搜榜:探索热门话题,引领潮流新风尚

在信息爆炸的时代&#xff0c;我们每天都在接收大量的新鲜资讯。而作为短视频领域的佼佼者&#xff0c;抖音已经成为了众多网友获取信息、娱乐休闲的重要平台。抖音热搜榜更是凭借其独特的魅力&#xff0c;吸引了无数用户的关注。本文将为您深度解析抖音热搜榜&#xff0c;带您…

vue2 element手术麻醉信息系统源码,手术预约、手术安排、排班查询、手术麻醉监测、麻醉记录单

手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流程&#xff0c;实现麻醉手术过程的信息数字化&#xff0c;自动生成麻…

顺应趋势,用大数据精准营销抓住大数据时代的机遇

想先问大家一个问题&#xff1a;“你觉得现在的营销好做吗&#xff1f;”想必大多数人在说到自己如何营销这一点上&#xff0c;都有道不完的“苦水”。“现在找客户难&#xff0c;投了几十万的广告费&#xff0c;真正来的客户却少得可怜&#xff0c;平均获客成本高得吓人”一位…

AD9371 官方例程HDL详解(一)

文章目录 前言一、AD9371 ----> FMC_DP二、FMC_DP ----> FPGA_TX/RX三、rx_data_x and tx_data_x must be connected to the same channel四、ADRV9009 前言 axi_ad9371_tx_jesd --> util_ad9371_xcvr接口映射讲解 一、AD9371 ----> FMC_DP AD9371内部原理图 …

[计算机网络基础]数据链路层

相比于网络层,数据链路层的内容多而且很杂,因为同时涉及到一些物理和网络的东西,甚至内容很冗杂.因为一些原因,这篇文章将主要以对比为主,而不是完全树形展开,方便各位看官理解. 这篇我估计要写上整整两天......太多了......各位看官尤其是同学们,来个赞/收藏/关注呗 1.关于数…

StudioOne升级6.5版本,最新功能测评

PreSonus流行的Studio One DAW的最新更新现已发布&#xff0c;标题功能是许多用户一直在等待的&#xff1a;支持包括杜比全景声在内的沉浸式音频格式。该软件的分数编辑器也已更新&#xff0c;以及其他一些一般增强和改进&#xff0c; 集成 Dolby Atmos 的 Studio One 正式发布…

【JavaEE】CAS -- 多线程篇(7)

CAS 1. 什么是 CAS2. CAS 伪代码3. CAS 是怎么实现的4. CAS的应用4.1 实现原子类4.2 实现自旋锁 5. CAS 的 ABA 问题 1. 什么是 CAS CAS: 全称Compare and swap&#xff0c;字面意思:”比较并交换“能够比较和交换 某个寄存器中的值和内存中的值, 看是否相等, 如果相等, 则把另…

三、组件与数据交互

一、组件基础 1、单文件组件 第一步&#xff1a;引入组件 import ComponentTest from ./components/ComponentTest.vue 第二步&#xff1a;挂载组件 components: {ComponentTest } 第三步&#xff1a;显示组件 <ComponentTest></ComponentTest><!-- 父组件 --…

python requests爬取税务总局税案通报、税务新闻和政策解读

文章目录 环境配置页面爬取流程税案通报爬取code税务新闻爬取政策解读爬取 环境配置 python&#xff1a;3.7 requests&#xff1a;发出请求&#xff0c;返回页面 beautifulsoup&#xff1a;解析页面 time&#xff1a;及时 warnings&#xff1a;忽视警告 页面 网址&#xff1…

游戏d3dcompiler_43.dll缺失怎么修复,分享5个快速有效的修复方法

最近我遇到了一个特别棘手的问题&#xff1a;当我试图运行一款新的游戏时&#xff0c;我收到一个令人困惑的错误消息&#xff0c;提示“d3dcompiler_43.dll丢失”。这个问题给我的游戏生活带来了很大的困扰&#xff0c;因为我热爱的游戏突然之间变得无法游玩。在这篇文章中&…

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器&#xff08;Central Processing Unit&#xff09;是Android设备的核心组件之一&#xff0c;负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构&#xff0c;如ARM Cortex-A系列处理器。这些处理器具有高性能…

C++ Primer笔记002:引用/指针/const

文章目录 1. 引用1.1 引用不是对象或变量1.2 引用必须初始化1.3 不能定义引用的引用1.4 引用类型要适配1.5 非const引用不能绑定字面值 2. 指针2.1 指针和引用的区别2.2 指针的指针2.3 类型一致2.4 指针的引用2.5 void 型指针 3. const3.1 const的基本作用3.2 对const变量的引用…

【VisualStudio 】VisualStudio2022 项目模板

引言 最近写项目已经形成的自己的套路&#xff1a;新建一个prism工程&#xff0c;添加主界面&#xff0c;配置界面&#xff0c;等&#xff0c;很多常用功能已经封装成项目进行复用。如果每次来了一个新的活&#xff0c;重新配置这些都是完全重复的工作&#xff08;大概需要十几…

第三章 Python 机器学习入门之C4.5决策树算法

系列文章目录 第一章 Python 机器学习入门之线性回归 第一章 Python 机器学习入门之梯度下降法 第一章 Python 机器学习入门之牛顿法 第二章 Python 机器学习入门之逻辑回归 番外 Python 机器学习入门之K近邻算法 番外 Python 机器学习入门之K-Means聚类算法 第三章 Python 机…