(LeetCode 每日一题) 2099. 找到和最大的长度为 K 的子序列 (排序)
题目:2099. 找到和最大的长度为 K 的子序列
思路:用数组对记录每个元素的值和对应的下标,然后按元素值对数组对进行降序排序,接着对前k个数组对按下标进行升序排序,时间复杂度0(nlogn)。
C++版本:
class Solution {
public:typedef pair<int,int> PII;static bool cmp1(PII a,PII b){return a.first>b.first; }static bool cmp2(PII a,PII b){return a.second<b.second;}vector<int> maxSubsequence(vector<int>& nums, int k) {vector<PII> v;for(int i=0;i<nums.size();i++){v.push_back({nums[i],i});}sort(v.begin(),v.end(),cmp1);sort(v.begin(),v.begin()+k,cmp2);vector<int> ans;for(int i=0;i<k;i++){ans.push_back(v[i].first);}return ans;}
};
JAVA版本:
class Solution {public int[] maxSubsequence(int[] nums, int k) {int n=nums.length;int[][] v=new int[n][2];for(int i=0;i<n;i++){v[i][0]=i;v[i][1]=nums[i];}Arrays.sort(v,(x,y)-> Integer.compare(y[1],x[1]));Arrays.sort(v,0,k,(x,y)-> Integer.compare(x[0],y[0]));int[] ans=new int[k];for(int i=0;i<k;i++){ans[i]=v[i][1];}return ans;}
}
Go版本:
func maxSubsequence(nums []int, k int) []int {n:=len(nums)v:=make([][]int,n)for i:=0;i<n;i++ {v[i]=[]int{nums[i],i}}sort.Slice(v,func(x,y int) bool{return v[x][0]>v[y][0]})sort.Slice(v[:k],func(x,y int) bool {return v[x][1]<v[y][1]})ans:=make([]int,k)for i:=0;i<k;i++ {ans[i]=v[i][0]}return ans
}