虽说对组的本质就是一个结构体,但在刷题时,可以通过此性质变很好的将数组位置和值存储起来。在构建某特定要求的数组(队列)很好用。
找到和最大的长度为 K 的子序列
给你一个整数数组 nums 和一个整数 k 。你需要找到 nums 中长度为 k 的 子序列 ,且这个子序列的 和最大 。
子序列 定义为从一个数组里删除一些元素后,不改变剩下元素的顺序得到的数组。
思路:
先将数组排序,找到前k个最大值,在将这前k个最大值恢复原顺序,如何恢复呢,就是我们前面的采用对组啦,我们存储时,将位置与值同时存储,第一次将值从大到小排序,第二次对前k个元素位置从小到大排序(恢复了原顺序,因为位置存储时本就从小到大)
代码实现:
class Solution {
public:
vector<int> maxSubsequence(vector<int>& nums, int k) {
vector<pair<int,int>>s;
vector<int>ans;
int n=nums.size();
for(int i=0;i<n;i++)
{
s.emplace_back(i,nums[i]);
}
sort(s.begin(),s.end(),[&](auto x1,auto x2){
return x1.second>x2.second;
});
sort(s.begin(),s.begin()+k);
for(int i=0;i<k;i++)
{
ans.emplace_back(s[i].second);
}
return ans;
}
};