解题思路:本题根据题意,寻找特性,首先是一个子序列,而且是固定长度的,而且有一个条件是,前几个数字在整个数组中越小越好,所以可以想到单调栈,单调栈保证栈中的数据都是单调递增的,这样就可以保证序列中的前几个数据都是尽量比较小。
class Solution {
public int[] mostCompetitive(int[] nums, int k) {
// 单调递增且每次递增的元素都是后面最小的
Deque<Integer> queue = new LinkedList<>();
// 单调递增栈
int len = nums.length;
for(int i=0;i<len;i++){
// 这一步判断还需要的元素个数是否小于剩下的元素个数
while(!queue.isEmpty() && nums[i]<nums[queue.peekLast()] && k-queue.size() < len-i){
queue.pollLast();
}
// 如果元素不够,或者不符合单调栈的条件,就直接将元素加入
queue.add(i);
}
int[] res = new int[k];
int index = 0;
while(!queue.isEmpty() && index<k){
int x = nums[queue.pollFirst()];
res[index] = x;
index++;
}
return res;
}
}