2099. 找到和最大的长度为 K 的子序列
解题经验:
1.求k个数问题,就将k个数放到堆中
2.本题巧妙在用int[]记录了键和值,比map好的地方在于,可以存储重复的键
map ~~ int[][] -->二维数组优点:可以存重复的键
public int[] maxSubsequence(int[] nums, int k) {
if (nums == null || nums.length == 0)
return null;
else if (nums.length == k)
return nums;
// 辅助数组 值+下标
PriorityQueue<int[]> p = new PriorityQueue<>((o1,o2)->o1[0]-o2[0]);
for (int i = 0; i < k; i++) {
p.offer(new int[]{nums[i],i});
}
// 取出前k个元素的下标
for (int i = k;i < nums.length;i++){
if (nums[i] > p.peek()[0]){
p.add(new int[]{nums[i],i});
p.poll();
}
}
int[] index = new int[k];
int[] result = new int[k];
for (int i = 0; i < k; i++) {
index[i] = p.poll()[1];
}
Arrays.sort(index);
for (int i = 0; i < k; i++) {
result[i] = nums[index[i]];
}
return result;
}