• 1673. Find the Most Competitive Subsequence (M)


    Find the Most Competitive Subsequence (M)

    题目

    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 <= 10^5
    • 0 <= nums[i] <= 10^9
    • 1 <= k <= nums.length

    题意

    从数组中删去若干个数,使剩余k个数组成的序列字典序最小。

    思路

    单调栈。维护一个最大容量为k的栈,遍历所有数字,如果比栈顶元素大则直接压入栈中(栈未满),如果比栈顶元素小则不断出栈直到栈顶元素小于当前数或栈空。需要注意最后一定要使栈满,所以要记录剩余可丢弃元素的次数。


    代码实现

    Java

    class Solution {
        public int[] mostCompetitive(int[] nums, int k) {
            Deque<Integer> deque = new ArrayDeque<>();
            int toDrop = nums.length - k;
            int i = 0;
    
            while (toDrop > 0 && i < nums.length) {
                if (deque.isEmpty() || deque.size() < k && deque.peek() <= nums[i]) {
                    deque.push(nums[i]);
                } else if (deque.peek() <= nums[i]) {
                    toDrop--;
                } else if (deque.peek() > nums[i]) {
                    while (toDrop > 0 && !deque.isEmpty() && deque.peek() > nums[i]) {
                        toDrop--;
                        deque.pop();
                    }
                    deque.push(nums[i]);
                }
                i++;
            }
    
            while (deque.size() < k) {
                deque.push(nums[i++]);
            }
    
            int[] ans = new int[k];
            i = 0;
            while (i < k) {
                ans[i++] = deque.removeLast();
            }
    
            return ans;
        }
    }
    
  • 相关阅读:
    小李子和他的水枪
    尼布尔的祈祷文
    牢骚太盛防肠断,风物长宜放眼量。
    常见浏览器userAgent请求头信息
    微信浏览器点击事件不生效怎么解决?
    2019上半年软件设计师上午考试真题
    360浏览器断网广告怎么去?
    谷歌浏览器打开一个新页面时使用新的标签
    Deep Learning in Bioinformatics
    TensorFlow Playground
  • 原文地址:https://www.cnblogs.com/mapoos/p/14310418.html
Copyright © 2020-2023  润新知