leetcode 3080

leetcode 3080

题目

在这里插入图片描述

例子

在这里插入图片描述

思路

创建数组,记录nums 的值 对应的id, 按照大小排序。

代码实现

class Solution {
public:vector<long long> unmarkedSumArray(vector<int>& nums, vector<vector<int>>& queries) {vector<long long> res;int n = nums.size();/*ids 数组是为了记录nums的val的index的序列。举个例子:nums = [1,2,2,1,2,3,1]ids[0] [1] [2] 对应的值是0, 3, 6因为nums[0], nums[3], nums[6] 的值都是1,是最小值;*/vector<int> ids(n);iota(ids.begin(), ids.end(), 0);ranges::stable_sort(ids, [&](int i, int j) { return nums[i] < nums[j]; });for(int i=0; i<queries.size(); i++){int q_id = queries[i][0];int q_num = queries[i][1];// 被标记的id 的nums的值,设置为0, 这样计算sum 的时候,直接默认标记了。// 已知nums 是正整数数组,正整数的范围是 >0 的。nums[q_id] = 0;int j =0;while(q_num > 0 && j<n){int num_id = ids[j];if(nums[num_id] == 0){j++;}else{nums[num_id] = 0;q_num--;j++;}}long long sum = std::accumulate(nums.begin(), nums.end(), 0);res.push_back(sum);}return res;}
};

long long sum = std::accumulate(nums.begin(), nums.end(), 0LL);

解决了runtime error , 还是有超时问题。

在这里插入图片描述

class Solution {
public:vector<long long> unmarkedSumArray(vector<int>& nums, vector<vector<int>>& queries) {vector<long long> res;int n = nums.size();long long sum = std::accumulate(nums.begin(), nums.end(), 0LL);/*ids 数组是为了记录nums的val的index的序列。举个例子:nums = [1,2,2,1,2,3,1]ids[0] [1] [2] 对应的值是0, 3, 6因为nums[0], nums[3], nums[6] 的值都是1,是最小值;*/vector<int> ids(n);iota(ids.begin(), ids.end(), 0);ranges::stable_sort(ids, [&](int i, int j) { return nums[i] < nums[j]; });int j =0;for(int i=0; i<queries.size(); i++){int q_id = queries[i][0];int q_num = queries[i][1];// 被标记的id 的nums的值,设置为0, 这样计算sum 的时候,直接默认标记了。// 已知nums 是正整数数组,正整数的范围是 >0 的。sum = sum - nums[q_id];nums[q_id] = 0;while(q_num > 0 && j<n){int num_id = ids[j];if(nums[num_id] > 0){sum = sum - nums[num_id];nums[num_id] = 0;q_num--;}j++;}            res.push_back(sum);}return res;}
};

减少while or loop 里的计算or 判断,可以减少执行时间。

分析

时间复杂度:
O(nlogn)
stable_sort 的时间复杂度是nlogn;
stable_sort 使用的是归并排序;
对于递归方程 T(n) = 2T(n/2) + O(n),我们可以通过分析归并排序的算法流程来推导出时间复杂度为 O(n log n)。

  1. 根据递归方程 T(n) = 2T(n/2) + O(n),我们可以得到以下递归树:
        T(n)/     \T(n/2)   T(n/2)/   \     /   \
T(n/4) T(n/4) T(n/4) T(n/4)
  1. 递归树的每一层的时间复杂度为 O(n),因为每层的合并操作需要线性时间。

  2. 递归树的高度为 log n,因为每次将序列一分为二,直到子序列只有一个元素。

  3. 在递归树的每一层,都有 O(n) 的合并操作,总共有 log n 层,因此总的时间复杂度为 O(n log n)。

综上所述,通过对递归方程和递归树的分析,可以得出归并排序的时间复杂度为 O(n log n)。

希望这个解释能够帮助您理解如何从递归方程推导出时间复杂度为 O(n log n)。如果您有任何其他问题,请随时告诉我。

空间复杂度:
O(n)

stable_sort 函数

对于 ranges::stable_sort(ids, [&](int i, int j) { return nums[i] < nums[j]; }); 这样的调用方式,我们可以简单地了解其实现原理。由于 ranges::stable_sort 是 C++20 中引入的新函数,其具体实现可能会因标准库的不同而有所差异。以下是一个简单的伪代码示例,展示了 ranges::stable_sort 的可能实现:

template <class RandomAccessIterator, class Compare>
void ranges::stable_sort(RandomAccessIterator first, RandomAccessIterator last, Compare comp) {if (first == last) return;using value_type = typename std::iterator_traits<RandomAccessIterator>::value_type;std::vector<value_type> temp(first, last); // 将范围内的元素复制到临时数组中// 使用 lambda 表达式作为比较函数auto lambda_comp = [&](int i, int j) { return comp(temp[i], temp[j]); };std::stable_sort(temp.begin(), temp.end(), lambda_comp); // 使用 std::stable_sort 对临时数组进行排序std::copy(temp.begin(), temp.end(), first); // 将排序后的元素复制回原始范围
}

上述伪代码简单地描述了 ranges::stable_sort 的实现思路。首先,将范围内的元素复制到临时数组中,然后使用 lambda 表达式作为比较函数,对临时数组进行排序,最后将排序后的元素复制回原始范围。这种实现方式保证了稳定排序的特性。

需要注意的是,实际的 ranges::stable_sort 实现可能会更加复杂,因为它需要考虑范围操作、迭代器特性、元素类型等多个因素。

accumulate 函数

std::accumulate 是 C++ 标准库中的一个算法函数,用于对一个范围内的元素进行累积操作。它定义在 <numeric> 头文件中。

std::accumulate 函数的原型如下:

template< class InputIt, class T >
T accumulate( InputIt first, InputIt last, T init );

其中:

  • InputIt 是输入迭代器的类型,用于指定范围的开始和结束位置。
  • T 是累积结果的类型,也是初始值的类型。
  • firstlast 分别是指向范围的起始和结束位置的迭代器。
  • init 是初始值,用于初始化累积结果。

std::accumulate 函数会从 firstlast 遍历范围内的元素,对它们进行累积操作。具体而言,它将初始值 init 和范围内的每个元素进行二元操作(通常是加法),并将结果存储在累积结果中。最终返回累积结果。

以下是一个示例用法:

#include <iostream>
#include <vector>
#include <numeric>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 std::accumulate 函数计算和int sum = std::accumulate(vec.begin(), vec.end(), 0);std::cout << "Sum of elements in the vector: " << sum << std::endl;return 0;
}

在这个示例中,我们使用 std::accumulate 函数计算了一个 std::vector 中所有元素的和,并将结果打印到控制台上。

std::accumulate 函数在处理累积操作时非常方便,可以用于对容器中的元素进行求和、求积、计算平均值等操作。希望这个介绍能够帮助您理解 std::accumulate 函数的用法。如果您有任何其他问题,请随时告诉我。

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

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

相关文章

hadoop伪分布式环境搭建详解

&#xff08;操作系统是centos7&#xff09; 1.更改主机名&#xff0c;设置与ip 的映射关系 hostname //查看主机名 vim /etc/hostname //将里面的主机名更改为master vim /etc/hosts //将127.0.0.1后面的主机名更改为master&#xff0c;在后面加入一行IP地址与主机名之间的…

Android VINF和兼容性矩阵

周末搞这玩意欲仙欲死&#xff0c;没办法只有看看。VINTF是供应商接口对象&#xff08;VINTF 对象&#xff09;&#xff0c;准确的说&#xff0c;这个是属于兼容性矩阵概念。。。有点想起了以前看过的一个电影&#xff0c;异次元杀阵。。。 1 基础 这个是谷歌官方的图。 本质…

基于JavaWeb+SSM+Vue“鼻护灵”微信小程序系统的设计和实现

基于JavaWebSSMVue“鼻护灵”微信小程序系统的设计和实现 滑到文末获取源码Lun文目录前言主要技术系统设计功能截图 滑到文末获取源码 Lun文目录 摘 要 3 Abstract 1 1 绪 论 1 1.1研究背景 1 工作的效率。 1 1.2 研究意义 1 1.3研究现状 1 1.4本文组织结构 2 2 技术介绍 3 2…

PyTorch深度学习实战(39)——小样本学习

PyTorch深度学习实战&#xff08;39&#xff09;——小样本学习 0. 前言1. 小样本学习简介2. 孪生网络2.1 模型分析2.2 数据集分析2.3 构建孪生网络 3. 原型网络3. 关系网络小结系列链接 0. 前言 小样本学习 (Few-shot Learning) 旨在解决在训练集中只有很少样本的情况下进行分…

【Leetcode每日一题】 递归 - 两两交换链表中的节点(难度⭐)(38)

1. 题目解析 题目链接&#xff1a;24. 两两交换链表中的节点 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 一、理解递归函数的含义 首先&#xff0c;我们需要明确递归函数的任务&#xff1a;给定一个链表&#xf…

C++学习基础版(二)

目录 五、继承与派生 1、继承和派生 2、三种继承方式 &#xff08;1&#xff09;公有继承【public】 &#xff08;2&#xff09;私有继承【private】 &#xff08;3&#xff09;保护继承【protected】 3、派生类的构造函数 带参数的基类构造函数调用 4、派生类的析构函…

第 126 场 LeetCode 双周赛题解

A 求出加密整数的和 模拟 class Solution { public:int sumOfEncryptedInt(vector<int> &nums) {int res 0;for (auto x: nums) {string s to_string(x);char ch *max_element(s.begin(), s.end());for (auto &c: s)c ch;res stoi(s);}return res;} };B 执行…

JavaEE--小Demo

目录 下载包 配置 修改文件 pom.xml application.properties 创建文件 HelloApi.java GreetingController.java Greeting.java DemoApplication.java 运行包 运行命令 mvn package cd target dir java -jar demo-0.0.1-SNAPSHOT.jar 浏览器测试结果 下载包 …

网站巡检:守护网络空间的看门人

在数字时代&#xff0c;互联网如同一座庞大的信息海洋&#xff0c;每天都有数不清的信息在这里生成、流通和消失。正如一所学校需要门卫来保护安全&#xff0c;网络世界同样需要守护者来确保其内容的健康和安全。在这个背景下&#xff0c;爱校对网站巡检服务应运而生&#xff0…

PCL安装(C++)并配置vs

准备工作&#xff1a; 1.PCL下载包(此教程使用PCL1.11.0) 3.visual studio(此教程使用vs2019) PCL下载&#xff1a; 1、找到自己适合的PCL版本,我选择的是PCL1.11.0。 1.1 Github下载&#xff1a;Releases PointCloudLibrary/pcl GitHub 1.2 百度网盘&#xff1a;https://pan…

【吊打面试官系列】Redis篇 - 关于Redis持久化

大家好&#xff0c;我是锋哥。今天分享关于Redis持久化的面试题&#xff0c;希望对大家有帮助&#xff1b; Redis 的持久化机制是什么&#xff1f;各自的优缺点&#xff1f; Redis 提供两种持久化机制 RDB 和 AOF 机制: 1、RDB &#xff08;Redis DataBase)持久化方式&#x…

Unity中UGUI中的PSD导入工具的原理和作用

先说一下PSD导入工具的作用&#xff0c;比如在和美术同事合作开发一个背包UI业务系统时&#xff0c;美术做好效果图后&#xff0c;程序在UGUI中制作好界面&#xff0c;美术说这个图差了2像素&#xff0c;那个图位置不对差了1像素&#xff0c;另外一个图大小不对等等一系列零碎的…

关于MySQL数据库的学习3

目录 前言: 1.DQL&#xff08;数据查询语言): 1..1基本查询&#xff1a; 1.2条件查询&#xff1a; 1.3排序查询&#xff1a; 1.3.1使用ORDER BY子句对查询结果进行排序。 1.3.2可以按一个或多个列进行排序&#xff0c;并指定排序方向&#xff08;升序ASC或降序DESC&#…

【数据结构入门】顺序表详解(增删查改)

目录 顺序表的基本概念 动态顺序表的实现 初始化 插入 尾插法 头插法 指定位置之前插入 删除 尾删法 头删法 指定位置删除 查找 销毁 顺序表的基本概念 什么是顺序表&#xff1f; 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般…

R语言:microeco:一个用于微生物群落生态学数据挖掘的R包,第六:trans_nullmodel class

近几十年来&#xff0c;系统发育分析和零模型的整合通过增加系统发育维度&#xff0c;更有力地促进了生态位和中性影响对群落聚集的推断。trans_nullmodel类提供了一个封装&#xff0c;包括系统发育信号、beta平均成对系统发育距离(betaMPD)、beta平均最近分类单元距离(betaMNT…

【赠书第20期】AI绘画与修图实战:Photoshop+Firefly从入门到精通

文章目录 前言 1 入门篇&#xff1a;初识Photoshop与Firefly 2 进阶篇&#xff1a;掌握Photoshop与Firefly的核心技巧 3 实战篇&#xff1a;运用Photoshop与Firefly进行创作 4 精通篇&#xff1a;提升创作水平&#xff0c;拓展应用领域 5 结语 6 推荐图书 7 粉丝福利 前…

idea 的基本配置

一、安装目录介绍 其中&#xff1a;bin 目录下&#xff1a; 二、配置信息目录结构 这是 IDEA 的各种配置的保存目录。这个设置目录有一个特性&#xff0c;就是你删除掉整个目录之后&#xff0c;重新启动 IntelliJ IDEA 会再自动帮你生成一个全新的默认配置&#xff0c;所以很多…

AI预测福彩3D第11弹【2024年3月17日预测--第2套算法重新开始计算第3次测试】

今天继续开始咱们第2套算法的验证&#xff0c;计划每套算法连续测试10期&#xff0c;达到50%的命中率即为较优的模型&#xff0c;可继续使用。老规矩&#xff0c;先上图表&#xff0c;再下结论~ 最终&#xff0c;经过研判分析&#xff0c;2024年3月17日福彩3D的七码预测结果如下…

理财第一课:炒股词典

文章目录 基础代码规则委比委差量比换手率市盈率市净率 散户亏钱的原因庄家分析炒股战法波浪理论其它 钱者&#xff0c;人生之大事&#xff0c;死生存亡之地&#xff0c;不可不察也。耕田之利&#xff0c;十倍&#xff1b;珠玉之赢&#xff0c;百倍&#xff1b;闹革命&#xff…

Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 Flask vs. Django&#xff1a;选择适合你的Web开发框架 在选择一个适合你项目的Web开发框架…