【Leetcode 1793】好子数组的最大分数 —— 单调栈

1793. 好子数组的最大分数

给你一个整数数组nums(下标从0开始)和一个整数k

一个子数组(i, j)分数 定义为min(nums[i], nums[i+1], ..., nums[j]) * (j - i + 1)。一个 子数组的两个端点下标需要满足i <= k <= j

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

示例 1:

输入:nums = [1,4,3,7,4,5], k = 3
输出:15
解释:最优子数组的左右端点下标是 (1, 5) ,分数为 min(4,3,7,4,5) * (5-1+1) = 3 * 5 = 15 。

示例 2:

输入:nums = [5,5,4,5,4,1,1,1], k = 0
输出:20
解释:最优子数组的左右端点下标是 (0, 4) ,分数为 min(5,5,4,5,4) * (4-0+1) = 4 * 5 = 20 。

题目分析

单调栈

解题思路:

  1. 维持一个单调递减栈,用于存储数组元素的下标
  2. 遍历数组 nums,对于每个元素 nums[i],执行以下步骤:
    • 如果栈不为空且当前元素 nums[i] 小于栈顶元素对应的值 nums[stack.peek()],说明栈顶元素无法成为好子数组的右端点了。此时需要将栈顶元素出栈,并计算以栈顶元素为右端点的最大可能分数。分数计算公式为nums[stack.pop()] * (i - stack.peek() - 1)
    • 将当前元素下标 i 入栈
  3. 遍历完成后清空栈,此时右端点为nums.length - 1

单调栈详解及相关 Leetcode 题解见 Leetcode 单调栈详解

class Solution {public int maximumScore(int[] nums, int k) {int ans = 0;// 单调递减栈Stack<Integer> stack = new Stack<>();for (int i = 0; i < nums.length; i++) {while (!stack.isEmpty() && nums[stack.peek()] >= nums[i]) {int h = nums[stack.pop()];int left = stack.isEmpty() ? 0 : stack.peek() + 1;int right = i - 1;int w = right - left + 1;if (left <= k && k <= right) {ans = Math.max(ans, w * h);}}stack.push(i);}while (!stack.isEmpty()) {int h = nums[stack.pop()];int right = nums.length - 1;int left = stack.isEmpty() ? 0 : stack.peek() + 1;int w = right - left + 1;if (left <= k && k <= right) {ans = Math.max(ans, w * h);}}return ans;}
}

双指针

解题思路:以下标为k的元素作为中心向两边扩展,每次扩展一个单位。取左右边界的较大者作为下一个要扩展的区域。

  • [left, right] 表示下标 left 到 right 的区域为已经扩展过的区间
  • curValue = (right - left + 1) * min 表示包含 k 在内且区间长度为 (right - left + 1) 的最大值;

双指针,顾名思义就是同时使用两个指针,在序列、链表结构上指向的是位置,在树、图结构中指向的是节点,通过或同向移动,或相向移动来维护、统计信息

class Solution {public int maximumScore(int[] nums, int k) {int n = nums.length;int ans = nums[k];int min = nums[k];int left = k;int right = k;while (left > 0 || right + 1 < n) {if (right + 1 >= n || (left > 0 && nums[left - 1] > nums[right + 1])) {left--;min = Math.min(min, nums[left]);} else {right++;min = Math.min(min, nums[right]);}ans = Math.max(ans, (right - left + 1) * min);}return ans;}
}

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

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

相关文章

吴恩达2022机器学习专项课程(一) 5.8 学习率的选择

问题预览/关键词 梯度下降不正常工作的曲线是什么样子&#xff1f;如何调试学习率来检测代码中的bug&#xff1f;学习率过小的后果是&#xff1f;如何选择学习率&#xff1f; 笔记 1.曲线错误的样子 曲线没有逐步递减&#xff0c;由于学习率选择过大或代码有bug。 2.调试…

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】

LeetCode-279. 完全平方数【广度优先搜索 数学 动态规划】 题目描述&#xff1a;解题思路一&#xff1a;Python 动态规划五部曲&#xff08;完全平方数就是物品&#xff08;可以无限件使用&#xff09;&#xff0c;凑个正整数n就是背包&#xff0c;问凑满这个背包最少有多少物品…

在react项目中使用react-router-dom

如何在react项目中使用react-router-dom 使用 npx create-react-app b初始化项目,npm i react-router-dom安装router依赖首先从react-router-dom包中导出createBrowserRouter对象来创建路由对象和router.js文件 // 创建router文件 import { createBrowserRouter } from "…

MySQL面试题系列-12

MySQL是一个关系型数据库管理系统&#xff0c;由瑞典 MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一&#xff0c;在 WEB 应用方面&#xff0c;MySQL是最好的RDBMS (Relational Database Management System&#xff0c;关系数据…

在图片上画出mask和pred

画出论文中《Variance-aware attention U-Net for multi-organ segmentation》的图1&#xff0c;也就是在原图上画出mask和pred的位置。 新建一个文件夹 然后运行代码&#xff1a; import cv2 import os from os.path import splitext####第一次&#xff1a;把GT&#xff08…

【文件IO】JavaIO详解

一.文件的相关概念 什么是文件? 文件是计算机中存储信息的基本单位。文件通常指的是存储在计算机或其他数字存储设备上的一段信息的集合&#xff0c;这些信息可以是文本、图片、音频、视频等不同格式的数据。 文件路径: 文件的路径可以分为两类 相对路径:先指定一个"当前…

武汉星起航:成功挂牌,董事长张振邦:将持续为创业者提供支持

2023年10月30日&#xff0c;对于武汉星起航电子商务有限公司来说&#xff0c;是一个值得铭记的历史时刻。这一天&#xff0c;公司在上海股权托管交易中心成功挂牌展示&#xff0c;这不仅是公司发展历程中的一个重要里程碑&#xff0c;更是对其不懈努力和卓越成就的肯定。 武汉…

求三角形面积(C语言)

一、运行结果&#xff1b; 二、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <math.h>int main() {//初始化变量值&#xff1b;double a, b, c, s, area;//赋值&#xff1b;a 3.67;b 5.43;c 6.21;//运算求s&#xff1b…

【宝德PI300T G2智能小站开发教程(一)】如何配置通讯开发环境

目录 一.前言 二.windows通讯连接 1.安装ssh,scp等工具。 2.硬件准备 3.windows部署网络共享

阿里云ECS服务器上如何白嫖一年的腾讯云的SSL证书(详细保姆教程)

有的时候&#xff0c;我们在阿里云上有一个ECS备案的服务器&#xff0c;而且也有域名&#xff0c;但是现在很多场景下是需要Https协议的&#xff0c;如果用宝塔搭建网站系统的话&#xff0c;就需要一个SSL证书&#xff0c;目前阿里云上SSL证书购买要么是付费的&#xff0c;要么…

Leetcode算法训练日记 | day21

一、二叉搜索树的最小绝对差 1.题目 Leetcode&#xff1a;第 530 题 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数&#xff0c;其数值等于两值之差的绝对值。 示例 1&#xff1a; 输入&#xff1a;root [4,2,…

mapv修改源码实现图标和管道到统一页面显示,图标和管道和点击

一、效果图 二、背景 map 地图添加marker&#xff0c;是操作的dom&#xff0c;而mapv是使用的canvas方式&#xff0c;所以性能要好 三、Mapv和MapVGL的区别 百度地图 JavaScript API GL快速升级 和mapVGL的使用 Mapv 是一款基于百度地图的大数据可视化开源库&#xff0c;可以…

hibernate注解方式

hibernate注解方式 现在很多时候大家都认为使用xml配置过于繁琐&#xff0c;更习惯于使用注解的方式进行配置hibernate的映射关系了&#xff0c;可以将注解放在属性上&#xff0c;也可以放在getter方法上 // 标注该类是一个实体&#xff0c;name表示表名Entity(name "log…

【Linux】socket编程2

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 目录 &#x1f449;&#x1f3fb;客户端代码Makefile(生成目标文件)UdpClient.cc(客户端代码)服务端代码部分优化1&#xff08;接受客户端时显示客…

ffmpeg 将多个视频片段合成一个视频

ffmpeg 将多个视频片段合成一个视频 References 网络视频 6 分钟的诅咒。 新建文本文件 filelist.txt filelist.txtfile output_train_video_0.mp4 file output_train_video_1.mp4 file output_train_video_2.mp4 file output_train_video_3.mp4 file output_train_video_4.m…

淘宝扭蛋机小程序源码搭建:打造专属电商娱乐新平台

在数字化浪潮的推动下&#xff0c;电商平台不断创新&#xff0c;以满足消费者日益多样化的需求。淘宝扭蛋机小程序作为一种创新的电商娱乐形式&#xff0c;受到了广大用户的热烈追捧。为了满足市场需求&#xff0c;许多企业和开发者开始关注淘宝扭蛋机小程序的源码搭建&#xf…

Spring6-单元测试:JUnit

1. 概念 在进行单元测试时&#xff0c;特别是针对使用了Spring框架的应用程序&#xff0c;我们通常需要与Spring容器交互以获取被测试对象及其依赖。传统做法是在每个测试方法中手动创建Spring容器并从中获取所需的Bean。以下面的两行常见代码为例&#xff1a; ApplicationCo…

[C语言][数据结构][链表] 单链表的从零实现!

目录 零.必备知识 1.一级指针 && 二级指针 2. 节点的成员列表 a.数据 b.指向下一个节点的指针. 3. 动态内存空间的开辟 (malloc-calloc-realloc) 一.单链表的实现与销毁 1.1 节点的定义 1.2 单链表的尾插 1.3 单链表的头插 1.4 单链表的尾删 1.5 单链表的头删 1…

web蓝桥杯真题:外卖给好评

代码&#xff1a; <ul class"rate-list"><li><!-- TODO 补全 el-rate 属性 -->送餐速度&#xff1a;<el-rate show-score"true" changechangeSpeed($event) v-model"speed"></el-rate></li><li><…

挑错罐头=“害猫”!猫咪主食罐到底应该怎么选?

猫咪罐头已经成为众多猫奴们的喂养首选。它富含水分&#xff0c;有助于猫咪保持良好的泌尿系统健康&#xff0c;尤其对于那些不太喜欢饮水的猫咪来说&#xff0c;罐头无疑是补充水分的理想方式。罐头的口感极佳&#xff0c;肉质细腻&#xff0c;能够激发猫咪的食欲&#xff0c;…