leetcode1793--好子数组的最大分数

2024-03-22 20:12

本文主要是介绍leetcode1793--好子数组的最大分数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 题意

给定一个数组,求包含 a [ k ] a[k] a[k] m i n ( a r r ) × a r r . s i z e ( ) , s . t . a [ k ] ∈ a r r min(arr)\times arr.size(),s.t.a[k] \in arr min(arr)×arr.size(),s.t.a[k]arr
好子数组的最大分数

与柱形图面积相似,只是区间需要包含 a [ k ] a[k] a[k]

2. 题解

2.1 单调栈

求出左边第一个小和右边第一个小形成的区间包含 a [ k ] a[k] a[k]即可。

比原来代码多了一个判断。

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

我们从 k k k出发,那边的数比较大,我们就自增哪边;然后算此时区间的分数。

  • 自己代码
class Solution {
public:int maximumScore(vector<int>& nums, int k) {int n = nums.size();int left = k - 1, right = k + 1;int ans = nums[k];int minv = nums[k];while(left > -1 || right < n) {if (left > -1 && right < n) {if (nums[left] <= nums[right]){minv = min(minv, nums[right]);++right;}else {minv = min(minv, nums[left]);--left;}}else if ( left > -1) {minv = min(minv, nums[left]);--left;}else {minv = min(minv, nums[right]);++right;}ans = max(ans, (right - left - 1) * minv);}return ans;}
};
  • 灵神代码
    直接循环 n − 1 n-1 n1
class Solution {
public:int maximumScore(vector<int> &nums, int k) {int n = nums.size();int ans = nums[k], min_h = nums[k];int i = k, j = k;for (int t = 0; t < n - 1; t++) { // 循环 n-1 次if (j == n - 1 || i && nums[i - 1] > nums[j + 1]) {min_h = min(min_h, nums[--i]);} else {min_h = min(min_h, nums[++j]);}ans = max(ans, min_h * (j - i + 1));}return ans;}
};// 作者:灵茶山艾府

主要是证明正确性:

假设最大分数值的区间为 [ L , R ] [L,R] [L,R];

我们只需要证明当左指针 l p lp lp L L L时,右指针 r p rp rp一直移动到 R R R

和右指针 r p rp rp R R R时,左指针 l p lp lp一直移动到 R R R

假设 m i n ( a [ i ] ) = m , i ∈ [ L , R ] min\ (a[i]) = m, i \in [L,R] min (a[i])=m,i[L,R];

l p = L lp=L lp=L时, a [ l p − 1 ] < m a[lp - 1] \lt m a[lp1]<m一定成立;否则最大分数区间可以将该值包进来。

此时 a [ r p ] ≥ m > a [ l p ] a[rp] \ge m \gt a[lp] a[rp]m>a[lp],所以此时一定是 r p rp rp指针一直移动到 R R R

r p = R rp=R rp=R时同理,所以以哪边大移动哪边的策略一定能计算到最大分数区间。

这篇关于leetcode1793--好子数组的最大分数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/836113

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的