题目传送门:2099. 找到和最大的长度为 K 的子序列 - 力扣(LeetCode)
题目大意:
给定一个数组,从其中选择k个数使得和最大,按原序列中的顺序输出这些数。
题解
题目分为两个步骤,第一找到序列中的最大的k个数,第二将这k个数按原序列中的顺序排序。
我们选择用一个结构体来同时记录原序列中每个数的大小和在原序列中的位置,首先我们按照数字大小进行递减排序,以便得到最大的k个数。
对于排序后的序列,我们将前k大的数根据其在原序列中的下标大小进行递减排序。
排序后的前k个数即是题目要求的结果,同时保证了大小和原顺序。
参考代码
class Solution {
public:
struct couple{
int num;
int weizhi;
}a[1005],tmp;
void cmpnum(int x,int y)
{
if(a[x].num<a[y].num)
swap(a[x],a[y]);
}
void cmpwz(int x,int y)
{
if(a[x].weizhi>a[y].weizhi )
swap(a[x],a[y]);
}
vector<int> maxSubsequence(vector<int>& nums, int k) {
vector<int>ans;
for(int i=0;i<nums.size();i++)
{
a[i].num=nums[i];
a[i].weizhi=i;
}
for(int i=0;i<nums.size()-1;i++) //按数字大小降序冒泡排序
for(int j=0;j<nums.size()-i-1;j++)
cmpnum(j,j+1);
for(int i=0;i<k-1;i++)//前k大的数字,按序号递增冒泡排序
for(int j=0;j<k-i-1;j++)
cmpwz(j,j+1);
for(int i=0;i<k;i++)
ans.push_back(a[i].num);
return ans;
}
};