3113. 边界元素是最大值的子数组数目

Powered by:NEFU AB-IN

Link

文章目录

  • [3113. 边界元素是最大值的子数组数目](#3113. 边界元素是最大值的子数组数目)

3113. 边界元素是最大值的子数组数目

题意

给你一个 正 整数数组 nums 。

请你求出 nums 中有多少个子数组,满足子数组中 第一个 和 最后一个 元素都是这个子数组中的 最大 值。

思路

  1. st表
    找每个数x出现的下标,并判断当x和前一个x之间的最大值等于x时,记录下标;如果不是x,说明区间断了,那么就统计之前记录的下标,结果为 n * (n + 1) // 2,n为下标数组长度,并清空数组,加入新下标。最后将所有的非空下标数组都做一遍统计
  2. 单调栈
    https://leetcode.cn/problems/find-the-number-of-subarrays-where-boundary-elements-are-maximum/solutions/2738894/on-dan-diao-zhan-pythonjavacgo-by-endles-y00d/
    利用单调栈(处理两边比自己大或小的第一个元素)去清理掉垃圾数据,维护一个底大顶小的单调栈,记录元素及其出现次数。对栈顶元素判断大小

代码

python 复制代码
'''
Author: NEFU AB-IN
Date: 2024-08-01 19:55:47
FilePath: \LeetCode\3113\3113.py
LastEditTime: 2024-08-01 20:49:33
'''
# 3.8.19 import
import random
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache, reduce
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, comb, fabs, floor, gcd, hypot, log, perm, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin
from typing import Any, Callable, Dict, List, Optional, Tuple, TypeVar, Union

# Constants
TYPE = TypeVar('TYPE')
N = int(2e5 + 10)
M = int(20)
INF = int(1e12)
OFFSET = int(100)
MOD = int(1e9 + 7)

# Set recursion limit
setrecursionlimit(int(2e9))


class Arr:
    array = staticmethod(lambda x=0, size=N: [x() if callable(x) else x for _ in range(size)])
    array2d = staticmethod(lambda x=0, rows=N, cols=M: [Arr.array(x, cols) for _ in range(rows)])
    graph = staticmethod(lambda size=N: [[] for _ in range(size)])


class Math:
    max = staticmethod(lambda a, b: a if a > b else b)
    min = staticmethod(lambda a, b: a if a < b else b)


class IO:
    input = staticmethod(lambda: stdin.readline().rstrip("\r\n"))
    read = staticmethod(lambda: map(int, IO.input().split()))
    read_list = staticmethod(lambda: list(IO.read()))


class Std:
    class SparseTable:
        def __init__(self, data: list, func=lambda x, y: x | y):
            """Initialize the Sparse Table with the given data and function."""
            self.func = func
            self.st = [list(data)]
            i, n = 1, len(self.st[0])
            while 2 * i <= n:
                pre = self.st[-1]
                self.st.append([func(pre[j], pre[j + i]) for j in range(n - 2 * i + 1)])
                i <<= 1

        def query(self, begin: int, end: int):
            """Query the combined result over the interval [begin, end]."""
            lg = (end - begin + 1).bit_length() - 1
            return self.func(self.st[lg][begin], self.st[lg][end - (1 << lg) + 1])

# --------------------------------------------------------------- Division line ------------------------------------------------------------------


class Solution:
    def numberOfSubarrays(self, nums: List[int]) -> int:
        st = Std.SparseTable(nums, Math.max)
        index_list_dict = defaultdict(list)
        res = 0
        for i, num in enumerate(nums):
            list_ = index_list_dict[num]
            if list_:
                pre_id = list_[-1]
                if st.query(pre_id, i) == num:
                    list_.append(i)
                else:
                    res += len(list_) * (len(list_) + 1) // 2
                    list_.clear()
                    list_.append(i)
            else:
                list_.append(i)

        for _, list_ in index_list_dict.items():
            res += len(list_) * (len(list_) + 1) // 2
        return res
python 复制代码
class Solution:
    def numberOfSubarrays(self, nums: List[int]) -> int:
        ans = len(nums)
        st = [[inf, 0]]  # 无穷大哨兵
        for x in nums:
            while x > st[-1][0]:
                st.pop()
            if x == st[-1][0]:
                ans += st[-1][1]
                st[-1][1] += 1
            else:
                st.append([x, 1])
        return ans
相关推荐
今天AI了吗3 分钟前
Hermes Agent 搭建全流程:从本机试跑到可持续运行的个人 AI Agent
java·人工智能·python·学习·embedding
为啥全要学1 小时前
自注意力中随着根号dk的增大,qk点积的方差为什么也会增大
python·深度学习
来两个炸鸡腿1 小时前
【Datawhale2607】llm-algo-leetcode task02 基础算子
人工智能·python·大模型
庵中十三居士2 小时前
【纯AI无人工修改】AI Agent从0到1实战:50行Python手写核心循环,一次看懂所有Agent框架的底层逻辑
开发语言·人工智能·python
有同事要进步2 小时前
python常见问题--2
开发语言·python
天天爱吃肉82182 小时前
# 商用车多体动力学整车仿真学习笔记(开篇总览)
人工智能·笔记·python·功能测试·学习·汽车
Allen说改装2 小时前
2025 APAxpo佛山改装展的展出规模达到了多少平方米?
人工智能·python
Leinwin3 小时前
GPT-5.6 提示词编写范式重构:从“保姆式指令“到“四要素框架“的工程实践
后端·python·flask
aqi003 小时前
15天学会AI应用开发(十四)搭建LangChain的开发环境
人工智能·python·大模型·ai编程·ai应用