Leetcode 第 360 场周赛题解

新手必看:5分钟搞懂FFT波束形成的底层原理(从阵列信号到频域处理) 本文深入浅出地解析了FFT波束形成的底层原理,从阵列信号采集到频域处理的全过程。通过音乐节场景类比和Python代码示例,帮助新手快速理解多目标波束形成的核心技术,包括频域转换、相位补偿和性能优化策略,适用于雷达、声呐和5G通信等领域。 阅读详情

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. …
  4. 一直到 ⌊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)

02-Redis 核心特性与数据结构详解:揭秘高性能的技术内核 本文深度拆解 Redis 高性能的技术内核:揭秘其凭“内存存储 + C 语言开发” 实现微秒级延迟、10 万 + QPS 的性能优势;详解 5 种基础数据类型(String/Hash 等)与 4 种扩展数据类型(Stream/Geospatial 等)的特性及场景;还介绍多语言支持、RDB/AOF 持久化、主从复制 / 哨兵 / 集群等高可用方案,助读者掌握 Redis 技术核心与实践逻辑。 阅读详情

相关推荐

内核工作FAST‘25 Artifact Evaluation流程记录

在我们的paper中,复现需要用到傲腾持久化内存,因此,需要AE Reviewer访问到内网服务器中。我们的思路是购买云服务器,将其作为跳板机,内网服务器通过SSH反向代理与公网服务器建立隧道,AE Reviewer通过隧道访问内网服务器。我们在AE过程中使用。然后,把一切复现需要的代码环境,在chroot里面配置完成。

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 1216

【LeetCode1713】 得到子序列的最少操作次数

题目描述如下:给你一个数组 target ,包含若干互不相同的整数,以及另一个整数数组 arr ,arr 可能包含重复元素。 每一次操作中,你可以在 arr 的任意位置插入任一整数。比方说,如果 arr = [1,4,1,2] ,那么你可以在中间添加 3 得到 [1,4,3,1,2] 。你可以在数组最开始或最后面添加整数。 请你返回最少操作次数,使得 target 成为 arr 的一个子序列。 一个数组的子序列指的是删除原数组的某些元素(可能一个元素都不删除),同时不改变其余元素的相对顺序得到的数组。比方说

weixin_36174496的博客 410

SV--对象拷贝、参数化的类

对象拷贝,参数化的类

创芯人--fly的博客 1571

LeetCode 1713 得到子序列的最少操作次数[Map 二分法] HERODING的LeetCode之路

解题思路: 虽然是困难题,但是缕清思路一点也不麻烦。透过题目看本质,其实就是找两个序列汇总最大的连续子序列长度,返回target长度与子序列长度的差值。为了让他们序列有序,采取的方法是按照target的下标排序,形成map的映射,并且在arr中根据映射进行二分查找操作,如果arr中有target的元素,查找count中大于等于该索引的位置,没有说明是按序的,在count中加入该下标,有则把相应位置的值改成该索引,代码注释已经很详细了,代码如下: class Solution { public: i.

HERODING23的博客 340

android11-修改屏幕显示方向和触摸方向

参数0表示12点钟方向显示参数90表示3点钟方向显示参数180表示6点钟方向显示参数270表示9点钟方向显示。

Paper_Love的博客 2119

【安全加固】应对Sweet32攻击:TLS/SSL协议3DES漏洞深度解析与修复指南

本文深度解析了CVE-2016-2183(Sweet32攻击)漏洞,该漏洞利用TLS/SSL协议中3DES加密算法的64位块大小缺陷,通过大量数据流量实施“生日攻击”导致信息泄露。文章提供了从原理分析、系统排查到跨平台修复的完整指南,重点指导如何在Windows、Linux服务器及网络设备中禁用不安全的3DES密码套件,并采用AES-GCM等更安全的加密方式,以彻底修复此TLS/SSL漏洞。

weixin_29230649的博客 586

LeetCode——1713. 得到子序列的最少操作次数(Minimum Operations to Make a Subsequence)[困难]——分析及代码(Java)

LeetCode——1713. 得到子序列的最少操作次数[Minimum Operations to Make a Subsequence][困难]——分析及代码[Java]一、题目二、分析及代码1. 动态规划 + 二分(1)思路(2)代码(3)结果三、其他 一、题目 给你一个数组 target ,包含若干 互不相同 的整数,以及另一个整数数组 arr ,arr 可能 包含重复元素。 每一次操作中,你可以在 arr 的任意位置插入任一整数

江南土豆的博客 392

从零构建2.4G无线通信系统:MSPM0G3507与NRF24L01的深度协同设计

本文详细介绍了基于MSPM0G3507微控制器与NRF24L01射频模块构建2.4G无线通信系统的深度协同设计方案。内容涵盖系统架构、SPI通信优化、功耗管理、抗干扰机制及中断/DMA高效利用,为工业物联网应用提供高可靠、低功耗的无线传输解决方案。

rice5的博客 824

LeetCode题解(1713):得到子序列的最少操作次数(Python)

题目:原题链接(困难) 标签:二分查找、贪心算法 解法 时间复杂度 空间复杂度 执行用时 Ans 1 (Python) O(NlogN)O(NlogN)O(NlogN) O(N)O(N)O(N) 272ms (78.33%) Ans 2 (Python) Ans 3 (Python) 解法一: class Solution: def minOperations(self, target: List[int], arr: List[int]) -> int

长行 705

3.PCIe协议分析1-预备知识点

PCIE协议分析1主要讲一下四方面: PCI-E配置空间 PCI-E地址映射 PCI-E Bar空间 PCI-E层级结构详谈 (1)PCIE配置空间 我们过来学习PCIE的同学应该都接触各种类型的功能芯片吧,这些功能芯片连接在电路里面我们可以认为它是一个外部设备,这些设备里面有自己独有的寄存器区域,比如SDRAM里面的ID寄存器或者其他配置寄存器。好的,其实我们PCIE板卡也相当...

一个早起的程序员 4145

汇川Easy系列PLC系统PID指令编程应用(增量型)

增量式PIDS7-1200/1500增量式PID(输出归一化、支持PWM输出)_西门子1200pid算法公式-优快云博客文章浏览阅读1k次。本文介绍了S7-1200/1500 PLC中增量式PID算法的应用,包括输出归一化和PWM输出。通过详细解析,阐述了PID输出如何限制在0.0-1.0之间,并且如何将PID输出与PWM占空比关联,适用于温度等控制场景。

RXXW_Dor的博客 1427

每日一题.1713. 得到子序列的最少操作次数

解题思路 讲arr中的值修改成target中对于数字的下标 例如target = [6,4,8,1,3,2], arr = [4,7,6,2,3,8,6,1] 0,1,2,3,4,5 1,0,5,4,2,0,3 然后找出1,0,5,4,2,0,3中的最长上升子序即可 代码 class Solution { public int minOperations(int[] target, int[] arr) { /* 我们可以用一个哈希表记录ta

weixin_45221477的博客 189

在 SAP ECC 中定义 ledger 时遇到 “Define exactly one leading ledger“(消息号 FAGL_LEDGER_CUST012)的错误

摘要:SAP系统要求必须且只能定义一个主导分类账(Leading Ledger)。当出现错误消息FAGL_LEDGER_CUST012时,需通过事务码FINSC_LEDGER或SPRO路径检查分类账配置,确保仅有一个分类账被标记为"LeadingLedger",其余设为"Non-leadingLedger"。主导分类账是SAP默认用于标准报表的核心分类账,修改配置需谨慎以免影响已有数据。若问题未解决,建议检查未完成配置或查阅SAP Notes获取解决方案。

金牌架构师 802

【力扣 第 360 场周赛】题解(一题待补)

对于target中的每个为1的二进制位,要么用1个对应位nums中的数,要么用多个低位的数加起来,实在不行从高位借位(记录成本)。所以简单起见从1开始枚举,检查和之前的值和不为目标值,用哈希表记录。每一对和为目标值的两个数只能选一个,显然应该选小的。传球过程形成基环内向森林(一个点的自环也算环)。最后检查最高位是否存在借不到的情况,输出-1。可以分为最靠左的点和最靠右的点,就是把。以2为底取对数,记录每种2的幂的个数。想出最优的正解了,但是没写完。然后计算左右的差,求绝对值。

legend_yst的博客 463

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗

⭐️学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。本文是 LeetCode 上分之旅系列的第 42 篇文章,往期回顾请移步到文章末尾~

pengxurui的博客 311

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

周 赛 补 题

周赛补题

qq_63755344的博客 159

2834. 找出美丽数组的最小和

的个数不满足 n 的要求, 那么剩下的元素要从哪里取呢?这个题目我们想要最小和的数组, 并且两两元素之和不能为。区间继续取值. 我们可以计算剩余的区间值.返回符合条件的美丽数组所可能具备的。的个数满足 n 的要求, 也就是。中取剩下的个数, 这样才能满足。如果,个数还不够,那么就需要从。第 360 场周赛 第二题。满足下述条件,则称其为。, 因为我们不可能搞两个。区间中符合的个数最大为。整体的解题思路如下所示., 我们直接取个数为。

得不到的永远是骚栋. 363

Leetcode1713. 得到子序列的最少操作次数[C++题解]:LCS转化成LIS,转化为nlogn做法

刷题

阿正的梦工坊 645

动态规划(Dynamic Programming)详解:从入门到 LeetCode Hot 100

将一个复杂问题拆分成多个规模更小的子问题,通过保存子问题的计算结果,避免重复计算,最终得到原问题的答案。先看一个经典问题。dp[i] = 以第 i 个元素结尾的最优结果例如最长递增子序列。最长递增子序列不一定以最后一个元素结尾,因此必须遍历整个数组取最大值。dp[i] = 前 i 个元素的最优结果这种情况下,最终答案通常就是dp[n]。关键在于理解 dp 数组的定义。动态规划的核心并不是背诵某个固定模板,而是建立正确的状态定义,并通过状态转移方程解决问题。dp[i] 或 dp[i][j] 表示什么?

zengjiajun2006的博客 888

力扣73 矩阵置零

该解法通过标记含0的行和列来实现矩阵置零。遍历矩阵,用布尔数组记录有0的行和列;再遍历一次,若当前行或列被标记,则置为0。时间复杂度O(mn),空间复杂度O(m+n)。

Pniubi的博客 34

Hash表:两数之和、字母异位词分组、最长连续序列 [力扣 Hot100]

三道高频哈希表应用题:两数之和(利用HashMap快速查找补数)、字母异位词分组(排序后作为键分组)、最长连续序列(通过HashSet去重并仅从序列起点扩展)。核心思想均为借助哈希结构优化查找效率,避免重复计算。同时提及双指针等其他解法思路,体现算法设计中“空间换时间”的典型策略。

2403_87560480的博客 226

LeetCode Hot 100 二叉树专题(三):BST 二叉搜索树与右视图(Java)

本专题主线:三题(98 / 230 / 199)共用两把钥匙——BST 的中序序列严格递增,以及遍历中的"层"与"深度"标记。看懂这两点,三题共用一套模板。 结构约定:每题统一分三部分——①题目分析与解题思路(含易错点辨析);②常见解法(附代码)及讲解;③知识点总结。

2401_88612756的博客 717

LeetCode 3105.最长的严格递增或递减子数组:一次遍历

LeetCode 3105.最长的严格递增或递减子数组:一次遍历

<font color="Pink">Tisfy的博客</font> 189

【双指针|LeetCode1089 复写零】巧用逆向思路,破解原地覆盖陷阱

LeetCode1089.复写零要求原地复写数组中的0,避免覆盖未读元素。正向遍历会因写入操作破坏后续数据,故不可行。正确解法为逆向双指针:先正向预处理确定目标末尾位置,再从后向前复写,遇0写两个0,非0则直接搬运。需特别处理0复写越界情况(仅保留一个0)。时间复杂度O(n),空间复杂度O(1),是原地数组操作的经典范例。

2602_95684935的博客 231

力扣240搜索二维矩阵(二分查找)

本文介绍在力扣240题“搜索二维矩阵II”中,对每一行独立使用二分查找的解法。通过遍历每行并调用二分查找函数判断目标值是否存在,若找到则返回true,否则最终返回false。该方法利用了每行有序的特性,时间复杂度为O(m log n),其中m为行数,n为列数。具体二分查找逻辑可参考作者主页中关于力扣35题“搜索插入位置”的实现。

Pniubi的博客 87

LeetCode100 94. 二叉树的中序遍历

中序遍历(左根右)通过栈实现,模拟递归过程。从根开始,不断向左走并压栈,直到左子树为空;弹出栈顶节点访问(根),转向其右子树重复流程。样例:1→2→3,遍历顺序为1→3→2。时间复杂度O(n),空间复杂度O(h)。

Shaoxingzong的博客 164

力扣35搜索插入位置(二分查找)

该题通过二分查找寻找插入位置。使用 mid = (left + right) >> 1 防止整数溢出,等价于 (left + right) / 2,但更安全。当 target <= nums[mid] 时,更新答案并继续向左查找;否则向右。最终返回最小的插入位置,时间复杂度 O(log n),空间复杂度 O(1)。

Pniubi的博客 195
上一篇: Leetcode 第 361 场周赛题解
下一篇: Leetcode1839. 所有元音按顺序排布的最长子字符串
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值