【Leetcode】1793. 好子数组的最大分数

news2024/11/30 8:57:04

文章目录

  • 题目
  • 思路
  • 代码
  • 复杂度分析
    • 时间复杂度
    • 空间复杂度
  • 结果
  • 总结

题目

题目链接🔗
给你一个整数数组 n u m s nums nums (下标从 0 0 0 开始)和一个整数 k k k

一个子数组 ( i , j ) (i, j) (i,j) 的 分数 定义为 m i n ( n u m s [ i ] , n u m s [ i + 1 ] , . . . , n u m s [ j ] ) ∗ ( j − i + 1 ) min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1) min(nums[i],nums[i+1],...,nums[j])(ji+1)。一个 子数组的两个端点下标需要满足 i ≤ k ≤ j i \leq k \leq j ikj

请你返回 子数组的最大可能 分数 。

示例 1
输入:nums = [1,4,3,7,4,5], k = 3
输出:15
解释:最优子数组的左右端点下标是 (1, 5) ,分数为 m i n ( 4 , 3 , 7 , 4 , 5 ) ∗ ( 5 − 1 + 1 ) = 3 ∗ 5 = 15 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15 min(4,3,7,4,5)(51+1)=35=15

示例 2:
输入:nums = [5,5,4,5,4,1,1,1], k = 0
输出:20
解释:最优子数组的左右端点下标是 (0, 4) ,分数为 m i n ( 5 , 5 , 4 , 5 , 4 ) ∗ ( 4 − 0 + 1 ) = 4 ∗ 5 = 20 min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20 min(5,5,4,5,4)(40+1)=45=20

提示

  • 1 ≤ n u m s . l e n g t h ≤ 1 0 5 1 \leq nums.length \leq 10^5 1nums.length105
  • 1 ≤ n u m s [ i ] ≤ 2 ∗ 1 0 4 1 \leq nums[i] \leq 2 * 10^4 1nums[i]2104
  • 0 ≤ k < n u m s . l e n g t h 0 \leq k < nums.length 0k<nums.length

思路

为了解决这个问题,我们可以使用单调栈进行预处理。我们可以维护两个数组 l e f t left left r i g h t right right,其中 l e f t [ i ] left[i] left[i] r i g h t [ i ] right[i] right[i] 分别表示 n u m s [ i ] nums[i] nums[i] 的左边和右边比 n u m s [ i ] nums[i] nums[i] 小,且离 n u m s [ i ] nums[i] nums[i] 最近的位置。因此,以 n u m s [ i ] nums[i] nums[i] 为最小值的最长子数组就应该是 ( l e f t [ i ] , r i g h t [ i ] ) (left[i], right[i]) (left[i],right[i])。当 k k k ( l e f t [ i ] , r i g h t [ i ] ) (left[i], right[i]) (left[i],right[i]) 范围内时,我们维护 n u m s [ i ] × ( r i g h t [ i ] − l e f t [ i ] − 1 ) nums[i] × (right[i]−left[i]−1) nums[i]×(right[i]left[i]1) 的最大值即可。

代码

class Solution {
public:
    int maximumScore(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> left(n, -1), right(n, n);
        stack<int> stk;
        for(int i = 0; i < n; i++) {
            while(!stk.empty() && nums[stk.top()] >= nums[i]) {
                right[stk.top()] = i;
                stk.pop();
            }
            if(!stk.empty()) left[i] = stk.top();
            stk.push(i);
        }
        int ans = 0;
        for(int i = 0; i < n; i++) {
            int l = left[i], r = right[i];
            if(l < k && k < r) {
                ans = max(ans, nums[i]*(r - l - 1));
            }
        }
        return ans;
    }
};

复杂度分析

时间复杂度

  • 预处理阶段的时间复杂度为 O(n),其中 n 是数组的长度。
  • 寻找最大分数时,遍历了数组,时间复杂度为 O(n)。

综上所述,总的时间复杂度为 O(n)。

空间复杂度

  • 使用了额外的数组 left 和 right,它们的空间复杂度均为 O(n)。
  • 使用了一个栈,最坏情况下需要存储整个数组,因此空间复杂度为 O(n)。

综上所述,总的空间复杂度为 O(n)。

结果

在这里插入图片描述

总结

通过单调栈预处理出 l e f t left left r i g h t right right 数组,可以在 O ( n ) O(n) O(n) 的时间复杂度内解决这个问题。这种方法利用了单调栈的性质,使得寻找以 n u m s [ i ] nums[i] nums[i] 为最小值的子数组的左右边界成为可能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1529549.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Livox激光雷达 mid360 跑 fastlio2 - 流程记录

mid360 跑 fastlio2 一、配置 mid360 环境1.1、主机配置静态IP为192.168.1.501.2、Livox-SDK21.3、Livox_ros_driver2二、Fast-lio22.1、下载源码2.2、修改代码2.3、编译、运行 提示一下&#xff0c;如果在一些板上&#xff08;比如rk3399&#xff0c;或者是树莓派 &#xff0…

蓝桥杯java组 螺旋折线

题目描述 如图所示的螺旋折线经过平面上所有整点恰好一次。 对于整点(X, Y)&#xff0c;我们定义它到原点的距离dis(X, Y)是从原点到(X, Y)的螺旋折线段的长度。 例如dis(0, 1)3, dis(-2, -1)9 给出整点坐标(X, Y)&#xff0c;你能计算出dis(X, Y)吗&#xff1f; 【输入格…

Spring-AOP面相切面编程示例(有详细注释)

前提知识Spring-IOC容器注解方式使用https://blog.csdn.net/m0_61160520/article/details/136784799?spm1001.2014.3001.5501切点表达式https://blog.csdn.net/m0_61160520/article/details/136782885?spm1001.2014.3001.5501 案例 1.创建项目 2.导入依赖 <dependencie…

CSS 三大特性 详细讲解

CSS 三大特性及代码解释 层叠性 当相同选择器设置相同样式且发生冲突时&#xff0c;此时后者的样式会覆盖&#xff08;层叠&#xff09;前者冲突样式。CSS的层叠性就是用于解决样式冲突问题。 Input&#xff1a; <style>div {color: red;}div { color: blue; <!-…

webconfig-boot分布式项目Web一站式配置

1、前言 最近利用空余时间写了一个项目webconfig-boot 。该项目主要配置了web项目常用的一些配置&#xff0c;如统一参数校验、统一异常捕获、统一日期的处理、常用过滤器、常用注解等。引入依赖接口完成常规的web配置。 这里也是总结了笔者在项目开发中遇到的一些常用的配置…

springboot项目讲解

技术栈 vue(前端) springboot(后端主框架) mybatis&#xff08;ORM&#xff0c;用于后端和数据库的映射&#xff0c;即java对象转换成表&#xff09; mysql (关系型数据库) 顶层结构 .idea&#xff1a; idea缓存文件(不需要管) src&#xff1a;代码核心文件夹 —main&#xf…

Windows Terminal配置 美化

Windows 终端自定义提示符设置 | Microsoft Learn 安装PowerShell7 在 Windows 上安装 PowerShell - PowerShell | Microsoft Learn 设置默认为 PowerShell7 安装 在powerShell 开启远程权限 Set-ExecutionPolicy RemoteSigned -scope CurrentUserscoop 执行 iwr -useb ht…

王道机试C++续第6章 数学问题 贪心算法和蓝桥杯真题Day37倒计时24天

6.4 分解质因数 上一节讨论了素数的问题&#xff0c;而素数常用于分解质因数。每个数都可以写成一个或几个质数相乘的形式&#xff0c;其中每个质数都是这个数的质因数。把一个数用质因数相乘的形式表示出来&#xff0c;就称为分解质因数。例如&#xff0c;对一个数 x 分解素…

Centos7没有可用软件包 ifconfig问题解决

问题描述 在Centos7中查看ip没有ifconfig&#xff0c;使用yum安装ifconfig报错没有可用软件包 ifconfig问题解决 [rootlocalhost etc]# yum -y install ifconfig 已加载插件&#xff1a;fastestmirror base …

进程间通信 之 共享内存

目录 什么是共享内存&#xff1f; 共享内存的系统调用接口 共享内存 进程间通信的本质及前提&#xff1a;让不同的进程看到同一份资源&#xff01; 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间&#xff0c;这些进程间数据传递不再涉及到内核&a…

鸿蒙开发实战:【网络管理-Socket连接】

介绍 本示例主要演示了Socket在网络通信方面的应用&#xff0c;展示了Socket在两端设备的连接验证、聊天通信方面的应用。 效果预览 使用说明 1.打开应用&#xff0c;点击用户文本框选择要登录的用户&#xff0c;并输入另一个设备的IP地址&#xff0c;点击确定按钮进入已登录…

【毛毛讲书】【好运】为什么有些人天生就有好运眷顾?

重磅专栏推荐&#xff1a; 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域&#xff0c;包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用&#xff0c;以及与之相关的人工智能生成内容&#xff…

什么是web组态?Web组态软件哪个好用?

随着工业4.0的到来&#xff0c;物联网、大数据、人工智能等技术的融合应用&#xff0c;使得工业领域正在经历一场深刻的变革。在这个过程中&#xff0c;Web组态技术以其独特的优势&#xff0c;正在逐渐受到越来越多企业的关注和认可。那么&#xff0c;什么是Web组态&#xff1f…

轻巧的elasticsearch可视化工具

一、概述 常见的ES可视化工具有&#xff1a; kibanaelasticsearch-headElasticHDDejavucerebroelasticview 一、安装elasticview 在众多ES可视化龚居中&#xff0c;elasticview是一款比较轻量简洁&#xff0c;兼容性较好&#xff0c;可以兼容多个ES版本&#xff0c;不但可以进…

[蓝桥杯 2020 省 AB3] 限高杆

分层图建图典题 #include<bits/stdc.h> using namespace std; using ll long long; #define int long long const int N 6e510; const int inf 0x3f3f3f3f; const int mod 1e97; int e[N],ne[N],w[N],h[N],idx; void add(int a,int b,int c){e[idx] b,ne[idx] h[a]…

外键约束

目录 外键约束 对数据表进行初期设计&#xff0c;暂时不使用外键 验证限制三 验证级联删除 设置级联更新 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 外键约束 外键约束主要是在父子表关系中体现的一种约束操作。…

【二叉树】算法例题

目录 九、二叉树 68. 二叉树的最大深度 ① 69. 相同的树 ① √ 70. 翻转二叉树 ① 71. 对称二叉树 ① 72. 从前序与中序遍历序列构造二叉树 ② 73. 从中序与后续遍历序列构造二叉树 ② 74. 填充每个节点的下一个右侧节点指针 II ② 75. 二叉树展开为链表 ② 76.…

鸿蒙实战开发:【FaultLoggerd组件】讲解

简介 Faultloggerd部件是OpenHarmony中C/C运行时崩溃临时日志的生成及管理模块。面向基于 Rust 开发的部件&#xff0c;Faultloggerd 提供了Rust Panic故障日志生成能力。系统开发者可以在预设的路径下找到故障日志&#xff0c;定位相关问题。 架构 Native InnerKits 接口 Si…

Marin说PCB之电源完整性之直流压降仿真CST--03

本期内容主要讲解的是关于在CST软件上电源直流压降仿真VRM的一些相关参数设置&#xff0c;小编我在之前文章中有说到过如何利用CST仿真电源信号的直流压降&#xff0c;不过有一些问题我这边再去补充一些。 首先就是VRM芯片的设置了&#xff0c;小编我还是按照之前那样设置&…

腾讯云k8s容器服务

1、新建一个集群 这个网址&#xff1a; 登录登录 - 腾讯云 2、选择第一个 3、名字随便起一个&#xff0c;然后基本默认就行 4、 组件配置直接跳过&#xff0c;信息确认&#xff0c;等待集群初始化&#xff0c;等10分钟左右&#xff08;容器服务需要充点钱才行&#xff09; 5…