面试高频算法题补充系列:区间最大和问题

前言

了解更多常考高频算法题可以关注
公众号:一个搬砖的胖子
企业面试题库:https://codetop.cc/
小程序:CodeTop

本文章是对企业面试题库CodeTop的补充,汇总那些在Leetcode上找不到的面试高频题。

来看一下几篇面经的原文叙述

  • 面经1:挑选一个区间,区间值为区间和乘以区间内最小的数的值,求区间值最大的区间(2021.1 字节跳动-国际化-前端)
  • 面经2:无序数组,求一个值最大的区间,区间计算方案为:区间和 * 区间最小值(2020.09 字节跳动-电商-后端)
  • 面经3:[3,1,6,4,5,2],对于任意子序列可以计算一个X值,X=sum(subArray) * min(subArray),求最大X(2020.07 字节跳动-商业化-前端)

这其实是18年头条的校招笔试题目,难怪Leetcode上找不到。
在这里插入图片描述
ps:之前没有接触过单调栈的同学建议做一下LC84. 柱状图中最大的矩形,本题实际就是LC 84的改编题。

题目描述

给定一个数组,要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:区间中的最小数 * 区间所有数的和。

数组中的元素都是非负数。

输入两行,第一行n表示数组长度,第二行为数组序列。输出最大值。

输入
3
6 2 1
输出
36
解释:满足条件区间是[6] = 6 * 6 = 36;

题目分析

方法一:暴力。题目是找max(区间和 * 区间最小值),而满足的区间最小值一定是数组的某个元素。因此可以枚举数组,枚举时每个元素(设为x)作为区间最小值,在x左右两侧找到第一个比x小的元素,分别记录左右边界的下标为l,r,寻找边界时计算当前区间的和。那么以x为区间最小值的最大计算区间一定是[l+1,r-1]区间和*x。整个算法的时间复杂度是O(N^2)
方法二:单调栈。方法一中找每个元素左右边界的复杂度是O(N),通过单调栈的数据结构可以将其优化为O(1),因此优化后整个算法的时间复杂度可以达到O(N)。

之前没有接触过单调栈的同学建议做一下**LC84. 柱状图中最大的矩形,**实际上本题就是LC 84的改编题。

//单调栈,时间复杂度O(N)
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int N = 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值