Given an integer array nums
and a positive integer k
, return the most competitive subsequence of nums
of size k
.
An array's subsequence is a resulting sequence obtained by erasing some (possibly zero) elements from the array.
We define that a subsequence a
is more competitive than a subsequence b
(of the same length) if in the first position where a
and b
differ, subsequence a
has a number less than the corresponding number in b
. For example, [1,3,4]
is more competitive than [1,3,5]
because the first position they differ is at the final number, and 4
is less than 5
.
Example 1:
Input: nums = [3,5,2,6], k = 2 Output: [2,6] Explanation: Among the set of every possible subsequence: {[3,5], [3,2], [3,6], [5,2], [5,6], [2,6]}, [2,6] is the most competitive.
Example 2:
Input: nums = [2,4,3,3,5,4,9,6], k = 4 Output: [2,3,3,4]
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 109
1 <= k <= nums.length
找出最具竞争力的子序列。
给你一个整数数组 nums 和一个正整数 k ,返回长度为 k 且最具 竞争力 的 nums 子序列。
数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。
在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于 b 中对应的数字,那么我们称子序列 a 比子序列 b(相同长度下)更具 竞争力 。 例如,[1,3,4] 比 [1,3,5] 更具竞争力,在第一个不相同的位置,也就是最后一个位置上, 4 小于 5 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/find-the-most-competitive-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路是单调栈。题意是寻找一个长度为 K 的子序列且需要确保竞争力尽可能大,但是我第一次做的时候只是一味地照顾到了竞争力(栈中元素单调增)而没有照顾到栈中元素的个数,所以导致了有几个 test case 最后生成的子序列的长度不足 K。
这道题我们做的时候跟一般的单调栈的题目稍微有一些区别。总体思路还是单调栈,但是在遍历 input 数组的过程中,我们不光要保持栈中的元素单调增,同时栈中元素个数 + 剩下未遍历的元素个数需要一直大于 K,如果不满足则不能从栈中弹出元素了,否则会导致最后的子序列中元素个数不足 K 个。
时间O(n)
空间O(n)
Java实现
1 class Solution { 2 public int[] mostCompetitive(int[] nums, int k) { 3 int len = nums.length; 4 Deque<Integer> queue = new ArrayDeque<>(); 5 for (int i = 0; i < len; i++) { 6 while (!queue.isEmpty() && nums[i] < queue.peekLast() && queue.size() + len - i > k) { 7 queue.pollLast(); 8 } 9 if (queue.size() < k) { 10 queue.offerLast(nums[i]); 11 } 12 } 13 14 int[] res = new int[queue.size()]; 15 for (int i = 0; i < res.length; i++) { 16 res[i] = queue.pollFirst(); 17 } 18 return res; 19 } 20 }