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 函数的用法。如果您有任何其他问题,请随时告诉我。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【回溯专题】【蓝桥杯备考训练】:n-皇后问题、木棒、飞机降落【未完待续】

目录 1、n-皇后问题&#xff08;回溯模板&#xff09; 2、木棒&#xff08;《算法竞赛进阶指南》、UVA307&#xff09; 3、飞机降落&#xff08;第十四届蓝桥杯省赛C B组&#xff09; 1、n-皇后问题&#xff08;回溯模板&#xff09; n皇后问题是指将 n 个皇后放在 nn 的国…

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 &#xff08;1&#xff09;cout输出流 &#xff08;2&#xff09;endl操纵符 &#xff08;3&#xff09;cin输入流 二、C表达式和控制语句 1、数据机构 特别&#xff1a;布尔类型bool 2、算数运…

基于springboot的医院后台管理系统

采用技术 基于springboot的医院后台管理系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 患者管理 公告信息管理 公告类型管理 项目背景 互联网概…

【对顶队列】【中位数贪心】【前缀和】100227. 拾起 K 个 1 需要的最少行动次数

本文涉及知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 对顶队列&#xff08;栈&#xff09; 分类讨论 LeetCode100227. 拾起 K 个 1 需要的最少行动次数 给你一个下标从 0 开始的二进制数组 nums&#xff0c;其长度为 n &#x…

软件功能测试内容有哪些?湖南长沙软件测评公司分享

软件功能测试主要是验证软件应用程序的功能&#xff0c;且不管功能是否根据需求规范运行。是通过给出适当的输入值&#xff0c;确定输出并使用预期输出验证实际输出来测试每个功能。也可以看作“黑盒测试”&#xff0c;因为功能测试不用考虑程序内部结构和内部特性&#xff0c;…

#QT(事件--快捷键保存文件)

1.IDE&#xff1a;QTCreator 2.实验&#xff1a;QEvent,QMouseEvent,QKeyEvent。 在上一个文本编辑器的基础上实现快捷键"ctrls"保存文件。 3.记录 &#xff08;1&#xff09;查看QEVENT的有效事件 &#xff08;2&#xff09; 所有时间均继承于QEvent&#xff0c;任…

数学建模-邢台学院

文章目录 1、随机抽取的号码在总体的排序2、两端间隔对称模型 1、随机抽取的号码在总体的排序 10个号码从小到大重新排列 [ x 0 , x ] [x_0, x] [x0​,x] 区间内全部整数值 ~ 总体 x 1 , x 2 , … , x 10 总体的一个样本 x_1, x_2, … , x_{10} ~ 总体的一个样本 x1​,x2​,……

3_springboot_shiro_jwt_多端认证鉴权_Redis缓存管理器

1. 什么是Shiro缓存管理器 上一章节分析完了Realm是怎么运作的&#xff0c;自定义的Realm该如何写&#xff0c;需要注意什么。本章来关注Realm中的一个话题&#xff0c;缓存。再看看 AuthorizingRealm 类继承关系 其中抽象类 CachingRealm &#xff0c;表示这个Realm是带缓存…

使用Arthas

Arthas 是 Alibaba 在 2018 年 9 月开源的 Java 诊断工具。支持 JDK6&#xff0c; 采用命令行交互模式&#xff0c;可以方便的定位和诊断 线上程序运行问题。Arthas 官方文档十分详细&#xff0c;详见&#xff1a;https://alibaba.github.io/arthas 1、下载 代码托管地址之一…

不想当智能手表游戏掌机MP4的开发板不是好86盒

有道是&#xff0c;生活不易&#xff0c;多才多艺。 只是没想到有一天连开发板也能适用这句话。 你以为它只是一个平平无奇的智能家居86盒。 但它必要时它也可以化身智能手表。 或者是一个能随身携带的MP4。 甚至可以是一个能玩植物大战僵尸的触屏游戏掌机&#xff01; 项目简…

【CSP试题回顾】202212-3-JPEG 解码

CSP-202212-3-JPEG 解码 关键点&#xff1a;Z字扫描 在JPEG压缩中&#xff0c;Z字形扫描是一种将8x8块的数据按照Z字形&#xff08;或之字形&#xff09;顺序重新排列的过程。这样做的目的是为了将相似的数据&#xff08;尤其是零值&#xff09;放置在一起&#xff0c;从而提高…

windows 安装cuda 11.2过程记录

参考&#xff1a; https://blog.csdn.net/m0_45447650/article/details/123704930 https://zhuanlan.zhihu.com/p/99880204?from_voters_pagetrue 在显卡驱动被正确安装的前提下&#xff0c;在命令行里输入nvidia-smi.exe 下载CUDA Toolkit: https://developer.nvidia.com/…

C++ Qt开发:QTcpSocket网络通信组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍如何运用QTcpSocket组件实现基于TCP的网络通信…

Flutter-自定义图片3D画廊

效果 需求 3D画廊效果 设计内容 StackGestureDetectorTransformPositioned数学三角函数 代码实现 具体代码大概300行 import dart:math;import package:flutter/material.dart; import package:flutter_xy/widgets/xy_app_bar.dart;import ../../r.dart;class ImageSwitc…

[errcode] => 47003 [errmsg] => argument invalid! data.thing2.value invalid

[errcode] > 47003 [errmsg] > argument invalid! data.thing2.value invalid rid: 65f79ad9-09ea6af5-285a03af 检查了好大一圈&#xff0c;经过测试&#xff0c;原因是公众号模板消息接口中的字段不能超过20个汉字&#xff0c;包括标点符号。 虽然接口文档中参数说明…

基于深度学习的口罩人脸识别研究进展

MTCNN模型训练输入的所有图像都是正样本&#xff08;戴口罩的照片&#xff09;&#xff0c;没有负样本作为模型输入。在后续的识别任务模块中&#xff0c;导入MTCNN模型检测结果&#xff0c;对特征点进行编码比较进行识别。 基于MTCNN的口罩人脸识别框架可分为四个阶段&#xf…

数据结构试卷第九套

1.时间复杂度 2.树&#xff0c;森林&#xff0c;二叉树的转换 2.1树转二叉树 给所有的兄弟节点之间加一条连线&#xff1b;去线&#xff0c;只保留当前根节点与第一个叶子节点的连线&#xff0c;删除它与其他节点之间的连线&#xff1b;然后根据左孩子右兄弟进行调整&#xf…

C#装箱和拆箱

一&#xff0c;装箱 装箱是指将值类型转化为引用类型。 代码如下&#xff1a; 装箱的内部过程 当值类型需要被装箱为引用类型时&#xff0c;CLR&#xff08;Common Language Runtime&#xff09;会为值类型分配内存&#xff0c;在堆上创建一个新的对象。值类型的数据会被复…

Adobe Illustrator 2024 v28.3 (macOS, Windows) - 矢量绘图

Adobe Illustrator 2024 v28.3 (macOS, Windows) - 矢量绘图 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesign、Lightroom Classic、Media Encoder、Photoshop、Premiere Pro、Adobe XD 请访…

【机器学习】详细解析Sklearn中的StandardScaler---原理、应用、源码与注意事项

【机器学习】详细解析Sklearn中的StandardScaler—原理、应用、源码与注意事项 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x…