1673. 找出最具竞争力的子序列
给你一个整数数组 nums
和一个正整数 k
,返回长度为 k
且最具 竞争力 的 nums
子序列。
数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。
在子序列 a
和子序列 b
第一个不相同的位置上,如果 a
中的数字小于 b
中对应的数字,那么我们称子序列 a
比子序列 b
(相同长度下)更具 竞争力 。 例如,[1,3,4]
比 [1,3,5]
更具竞争力,在第一个不相同的位置,也就是最后一个位置上, 4
小于 5
。
示例 1:
输入:nums = [3,5,2,6], k = 2 输出:[2,6] 解释:在所有可能的子序列集合 {[3,5], [3,2], [3,6], [5,2], [5,6], [2,6]} 中,[2,6] 最具竞争力。
示例 2:
输入:nums = [2,4,3,3,5,4,9,6], k = 4 输出:[2,3,3,4]
提示:
1 <= nums.length <= 105
0 <= nums[i] <= 109
1 <= k <= nums.length
原站题解
php 解法, 执行用时: 376 ms, 内存消耗: 31.1 MB, 提交时间: 2024-05-24 09:41:00
class Solution {/*** @param Integer[] $nums* @param Integer $k* @return Integer[]*/function mostCompetitive($nums, $k) {$stack = [];$n = count($nums);$last = $n - $k;for ( $i = 0; $i < $n ; $i++ ) {while ( !empty($stack) && $last > 0 && end($stack) > $nums[$i] ) {array_pop($stack);$last--;}$stack[] = $nums[$i];}return array_slice($stack, 0, $k);}}
javascript 解法, 执行用时: 140 ms, 内存消耗: 76.4 MB, 提交时间: 2024-05-24 09:32:37
/*** @param {number[]} nums* @param {number} k* @return {number[]}*/var mostCompetitive = function(nums, k) {const st = [];for (let i = 0; i < nums.length; i++) {const x = nums[i];while (st.length && x < st[st.length - 1] && st.length + nums.length - i > k) {st.pop();}if (st.length < k) {st.push(x);}}return st;};
rust 解法, 执行用时: 40 ms, 内存消耗: 3.6 MB, 提交时间: 2023-09-25 11:07:19
impl Solution {pub fn most_competitive(nums: Vec<i32>, k: i32) -> Vec<i32> {let k = k as usize;let n = nums.len();let mut stack = vec![];let mut j = 0;for i in 0..n {while stack.len() > 0 && stack[stack.len()-1] > nums[i] && k + j < n {stack.pop();j += 1;}stack.push(nums[i]);}stack[0..k].to_vec()}}
golang 解法, 执行用时: 144 ms, 内存消耗: 9.1 MB, 提交时间: 2023-09-25 11:06:54
func mostCompetitive(nums []int, k int) []int {stack := []int{}n := len(nums)last := n-kfor i := 0; i < n ; i ++ {for len(stack) > 0 && last > 0 && stack[len(stack)-1] > nums[i] {stack = stack[:len(stack)-1]last--}stack = append(stack, nums[i])}return stack[:k]}
python3 解法, 执行用时: 200 ms, 内存消耗: 28.7 MB, 提交时间: 2023-09-25 11:06:34
class Solution:def mostCompetitive(self, nums: List[int], k: int) -> List[int]:stack = []n = len(nums)last = n-kfor i in range(n):while stack and last and stack[-1] > nums[i]:stack.pop()last -= 1stack.append(nums[i])return stack[:k]
java 解法, 执行用时: 17 ms, 内存消耗: 57.1 MB, 提交时间: 2023-09-25 11:06:19
class Solution {public int[] mostCompetitive(int[] nums, int k) {ArrayList<Integer> stack = new ArrayList<Integer>();int n = nums.length;int last = n-k;for (int i = 0; i < n; i ++) {while (stack.size()>0 && last>0 && stack.get(stack.size()-1)>nums[i]) {stack.remove(stack.size()-1);last --;}stack.add(nums[i]);}int[] res = new int[k];for(int i = 0; i < k; i++){res[i] = stack.get(i);}return res;}}
cpp 解法, 执行用时: 208 ms, 内存消耗: 108.9 MB, 提交时间: 2023-09-25 11:06:04
/*** 从左至右找到第一个逆序对,使得s[i]>s[i+1],维护一个单调栈,栈内元素单调不减,* 将s[i]删除才能使得最后字典序更小,注意可以删除的个数为n-k个。*/class Solution {public:vector<int> mostCompetitive(vector<int>& nums, int k) {vector<int> stk;int n = nums.size();int last = n - k;for (int i = 0; i < n; i ++){while (!stk.empty() && last > 0 && stk.back() > nums[i]){stk.pop_back();last --;}stk.push_back(nums[i]);}for (int i = 0; i < last; i ++){stk.pop_back();}return stk;}};