列表

详情


NC207590. 数据分析

描述

给出具有N个数字的数组,求长度为k的子数组中最大值的最小值。
例如数组,长度为3的子数组分别为,子数组最大值分别为 ,最小值为5
你需要返回一个长度恰好为 N 的序列,第一个元素为长度为 1 的子数组的最小值,第二个元素为长度为 2 的子数组的最小值,以此类推。


输入描述

注意,一个数组的子数组指的是这个数组的某个连续序列,如 [1,2] 和 [1,2,3] 都是 [1,2,3] 的子数组。

数据范围:
- 对于 30% 的数据,
- 对于 60% 的数据,
- 对于 100% 的数据,
对于 100% 的数据,数组中的数 a_i 范围为

示例1

输入:

[1,3,5,2,4,6]

输出:

[1,3,5,5,5,6]

示例2

输入:

[1,2,3,4,5,6]

输出:

[1,2,3,4,5,6]

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

Python3(3.9) 解法, 执行用时: 1317ms, 内存消耗: 15444K, 提交时间: 2020-11-24 09:55:33

#
# 找到所有长度子数组中最大值的最小值
# @param numbers int整型一维数组 牛牛给出的数据
# @return int整型一维数组
#
import sys 
class Solution:
    def getMinimums(self , numbers ):
        # write code here
        n = len(numbers)
        right = [n] * n 
        left = [-1] * n 
        st = []
        ans = [sys.maxsize] * n 
        for i in range(n):
            while st and numbers[st[-1]] < numbers[i]:
                right[st[-1]] = i 
                st.pop()
            if st:
                left[i] = st[-1]
            st.append(i)
        for i in range(n):
            length = right[i] - left[i] - 1
            ans[length-1] = min(ans[length-1],numbers[i])
        for i in range(n-2,-1,-1):
            ans[i] = min(ans[i],ans[i+1])
        return ans

C++(clang++11) 解法, 执行用时: 949ms, 内存消耗: 4700K, 提交时间: 2020-11-23 12:44:27

class Solution {
public:
    /**
     * 找到所有长度子数组中最大值的最小值
     * @param numbers int整型vector 牛牛给出的数据
     * @return int整型vector
     */
    vector<int> getMinimums(vector<int>& numbers) {
        int l = numbers.size();
        vector<int> ans(l, INT_MAX);
        numbers.emplace_back(INT_MAX);
        stack<int> s;
        for(int i = 0 ; i <= l; ++i){
            while(!s.empty() && numbers[s.top()] < numbers[i]){
                int tp = numbers[s.top()]; s.pop();
                for(int j = 0, n = !s.empty()?i-s.top()-1:i ;j<n; ++j){
                    ans[j] = min(ans[j], tp);
                }
            }
            s.push(i);
        }
        return ans;
    }
};

上一题