// 返回最大的k个数之和 -- 保持相对顺序不变
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;
}
解题启发:
1.堆解决k个数问题,可以先将k个数入堆
2.int[][2]可以替换map,并且优于map,因为可以使key重复