列表

详情


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]

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: vector<int> mostCompetitive(vector<int>& nums, int k) { } };

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-k
    for 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-k
        for i in range(n):
            while stack and last and stack[-1] > nums[i]:
                stack.pop()
                last -= 1
            stack.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;
    }
};

上一题