leetcode 3080

2024-03-18 06:12
文章标签 leetcode 3080

本文主要是介绍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 判断,可以减少执行时间。

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

这篇关于leetcode 3080的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/821428

相关文章

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L

leetcode-23Merge k Sorted Lists

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode mergeKLists

C++ | Leetcode C++题解之第393题UTF-8编码验证

题目: 题解: class Solution {public:static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num &

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

【JavaScript】LeetCode:16-20

文章目录 16 无重复字符的最长字串17 找到字符串中所有字母异位词18 和为K的子数组19 滑动窗口最大值20 最小覆盖字串 16 无重复字符的最长字串 滑动窗口 + 哈希表这里用哈希集合Set()实现。左指针i,右指针j,从头遍历数组,若j指针指向的元素不在set中,则加入该元素,否则更新结果res,删除集合中i指针指向的元素,进入下一轮循环。 /*** @param

LeetCode:64. 最大正方形 动态规划 时间复杂度O(nm)

64. 最大正方形 题目链接 题目描述 给定一个由 0 和 1 组成的二维矩阵,找出只包含 1 的最大正方形,并返回其面积。 示例1: 输入: 1 0 1 0 01 0 1 1 11 1 1 1 11 0 0 1 0输出: 4 示例2: 输入: 0 1 1 0 01 1 1 1 11 1 1 1 11 1 1 1 1输出: 9 解题思路 这道题的思路是使用动态规划

LeetCode 第414场周赛个人题解

目录 Q1. 将日期转换为二进制表示 原题链接 思路分析 AC代码 Q2. 范围内整数的最大得分 原题链接 思路分析 AC代码 Q3. 到达数组末尾的最大得分 原题链接 思路分析 AC代码 Q4. 吃掉所有兵需要的最多移动次数 原题链接 思路分析 AC代码 Q1. 将日期转换为二进制表示 原题链接 Q1. 将日期转换为二进制表示 思路分析

【JavaScript】LeetCode:21-25

文章目录 21 最大子数组和22 合并区间23 轮转数组24 除自身以外数组的乘积25 缺失的第一个正数 21 最大子数组和 贪心 / 动态规划贪心:连续和(count)< 0时,放弃当前起点的连续和,将下一个数作为新起点,这里提供使用贪心算法解决本题的代码。动态规划:dp[i]:以nums[i]为结尾的最长连续子序列(子数组)和。 dp[i] = max(dp[i - 1]