使用对组帮助排序

文章讲述了如何利用对组结构在数组中找到和最大的长度为K的子序列。首先对数组进行排序,然后找到前K个最大值,通过存储位置和值来恢复原顺序,从而得到最大和的子序列。
摘要由CSDN通过智能技术生成

虽说对组的本质就是一个结构体,但在刷题时,可以通过此性质变很好的将数组位置和值存储起来。在构建某特定要求的数组(队列)很好用。
找到和最大的长度为 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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值