leetcode 3080

news2024/11/18 19:36:59

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.coloradmin.cn/o/1525773.html

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

相关文章

基于Spring Boot的社区垃圾分类管理平台的设计与实现

摘 要 近些年来&#xff0c;随着科技的飞速发展&#xff0c;互联网的普及逐渐延伸到各行各业中&#xff0c;给人们生活带来了十分的便利&#xff0c;社区垃圾分类管理平台利用计算机网络实现信息化管理&#xff0c;使整个社区垃圾分类管理的发展和服务水平有显著提升。 本文拟…

训练数据集(一):真实场景下采集的煤矸石目标检测数据集,可直接用于YOLOv5/v6/v7/v8训练

文章目录 数据集介绍数据集训练精度展示数据集获取方式 数据集介绍 煤矸石训练数据集&#xff1a;891张&#xff1b;验证数据数据集&#xff1a;404张 数据集类别&#xff1a;0代表煤炭&#xff08;coal&#xff09;&#xff0c;1代表矸石&#xff08;gangue&#xff09;&…

BUU [FBCTF2019]RCEService

BUU [FBCTF2019]RCEService 开题&#xff0c;要求以json格式输入命令。 无任何信息泄露&#xff0c;源码如下&#xff1a; <?phpputenv(PATH/home/rceservice/jail);if (isset($_REQUEST[cmd])) {$json $_REQUEST[cmd];if (!is_string($json)) {echo Hacking attempt de…

机器硬件命令

一、查看机器核数 有以下几种方法 1、lscpu命令 lscpu命令可以显示关于CPU的信息&#xff0c;包括核数、线程数等。在终端中输入以下命令即可查看CPU核数&#xff1a;该命令会输出CPU每个物理插槽的核数。 lscpu | grep "Core(s) per socket" | awk {print $NF} …

腾讯云优惠券领取攻略:快速获取方法大揭秘

随着云计算技术的日益成熟&#xff0c;越来越多的企业和个人选择使用云服务来降低运营成本、提高运营效率。腾讯云作为国内领先的云计算服务提供商&#xff0c;凭借其稳定、安全、高效的云服务&#xff0c;赢得了广大用户的青睐。而领取腾讯云优惠券&#xff0c;无疑是降低云服…

Python接口自动化之接口依赖

一、场景说明 在面试接口自动化时&#xff0c;经常会问&#xff0c;其他接口调用的前提条件是当前用户必须是登录状态&#xff0c;如何处理接口依赖&#xff1f; 在此之前我们介绍过session管理器保存会话状态。如果接口请求需要携带token&#xff0c;那么又如果处理呢&#…

Greetings

Problem - 1915F - Codeforces 题意 给一些(l,r)找到所有能够包含(l,r)的数目 引入 也就是找逆序对个数 要用到归并排序中的思想&#xff1a; //https://www.luogu.com.cn/problem/P1216 #include<iostream> #include<cstdio> #include<stack> #include…

Midjourney绘图欣赏系列(十三)

Midjourney介绍 Midjourney 是生成式人工智能的一个很好的例子&#xff0c;它根据文本提示创建图像。它与 Dall-E 和 Stable Diffusion 一起成为最流行的 AI 艺术创作工具之一。与竞争对手不同&#xff0c;Midjourney 是自筹资金且闭源的&#xff0c;因此确切了解其幕后内容尚不…

毕设学习进展周报

文章目录 3.11-3.18 3.11-3.18 1.阅读ACL文献并记录 2.查找相关资料学习在阿里云部署ChatGLM3-6B 参考&#xff1a;https://blog.csdn.net/H66778899/article/details/135630030 # 运行 streamlit run /mnt/workspace/ChatGLM3/conposite_demo/main.py可以得到&#xff1a;…

Induction or tail-recursion

选择排序 遍历整个待排序的数组&#xff0c;从第一个元素开始。在未排序的部分中&#xff0c;找到最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其与第一个元素交换位置。接着从第二个元素开始&#xff0c;重复步骤2&#xff0c;直到所有元素都被排序 迭代版 递…

漏洞复现-宏景HJSOFT系列

漏洞复现-宏景 宏景人力系统任意文件读取漏洞宏景eHR FrCodeAddTreeServlet SQL注入宏景HCM 宏景人力系统 downlawbase接口存在SQL注入[1day]宏景某接口存在任意文件读取漏洞-附py增加宏景eHR人力资源信息管理系统sql注入检测宏景HCM人力资源信息管理系统任意文件上传漏洞宏景e…

Docker进阶:离线安装docker社区版(docker-18.06.3-ce)

Docker进阶&#xff1a;离线安装docker社区版&#xff08;docker-18.06.3-ce&#xff09; 1、准备离线安装所需的文件2、传输文件至目标Linux系统3、卸载旧版Docker4、离线安装Docker1、解压上传的Docker安装包2、拷贝文件到/usr/bin目录3、将 Docker 注册为系统服务4、重新加载…

AI助手 - Fitten Code

前言 上一篇介绍了商汤AI编程小助手小浣熊 Raccoon&#xff0c;过程中又发现了另外一款国产AI编程助手&#xff0c;那就是本篇要介绍的非十科技出品的Fitten Code。 ​ Fitten Code 主打一个快&#xff1a;超高准确率、超快的响应速度。号称代码生成比GitHub Copilot 快两倍&am…

逻辑运算函数

true默认为1 false默认为0 可以用于多条件筛选 if语句 多层嵌套

【JVM】(内存区域划分 为什么要划分 具体如何分 类加载机制 类加载基本流程 双亲委派模型 类加载器 垃圾回收机制(GC))

文章目录 内存区域划分为什么要划分具体如何分 类加载机制类加载基本流程双亲委派模型类加载器 垃圾回收机制&#xff08;GC&#xff09; 内存区域划分 为什么要划分 JVM启动的时候会申请到一整个很大的内存区域,JVM是一个应用程序,要从操作系统这里申请内存,JVM就需要根据,把…

jscpd对项目进行查重(支持150+类语言)

jscpd jscpd 查重时能够跳过标记为忽略的块和新行以及空符号和注释&#xff08;不支持尖括号注释<!-- --&#xff01;>&#xff09;&#xff0c;重复率判定依据为一定长度标识符的MD5值是否相同。 安装 npm install -g jscpd配置参数(查看更多) OptionTypeDefaultDes…

【C语言基础】:字符函数和字符串函数

文章目录 一、字符函数1. 字符分类函数2. 字符转化函数 二、字符串函数1. strlen函数的使用和模拟实现strlen函数的使用strlen函数的模拟实现 2. strcpy函数的使用和模拟实现strcpy函数的使用strcpy函数的模拟实现 3. strcat函数的使用和模拟实现strcat函数的使用strcat函数的模…

5 个最佳 Mock 工具

在持续发展的前端开发领域&#xff0c;一套高效的自动化工具是关键。这篇文章将带你了解五个出色的模拟工具&#xff0c;它们能极大提升你的生产力、简化数据仿真&#xff0c;并提升接口测试效率。对于寻求提高工作流的前端开发者来说&#xff0c;它们是必不可少的。让我们开始…

牛客题霸-SQL入门篇(刷题记录二)

本文基于前段时间学习总结的 MySQL 相关的查询语法&#xff0c;在牛客网找了相应的 MySQL 题目进行练习&#xff0c;以便加强对于 MySQL 查询语法的理解和应用。 以下内容是牛客题霸-SQL入门篇剩余的第 21-39 道题目的 SQL 代码答案。 由于涉及到的数据库表较多&#xff0c;因…

Jira自动化的实用工具——ScriptRunner简介及最佳实践

近日&#xff0c;龙智举办的DevSecOps研讨会年终专场“趋势展望与实战探讨&#xff1a;如何打好DevOps基础、赋能创新”在上海圆满落幕。龙智Atlassian技术与顾问咨询团队&#xff0c;以及清晖、JamaSoftware、CloudBees等生态伙伴的嘉宾发表了主题演讲&#xff0c;分享他们在D…