(补充)区间最小数乘区间和的最大值,一道字节跳动高频面试题

前言

本文章是对CodeTop 的补充,汇总那些在Leetcode上找不到的面试高频题
图片说明

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

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

这其实是18年头条的校招笔试题目。
18年头条的校招笔试题目

题目描述

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

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

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

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

题目分析

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

方法二:单调栈。方法一中找每个元素左右边界的复杂度是O(N),通过单调栈的数据结构可以将其优化为O(1),因此优化后整个算法的时间复杂度可以达到O(N)

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

代码

//单调栈,时间复杂度O(N)
#include <iostream>
#include <vector>
#include <stack>
using namespace std;
const int N = 500000+10;
int a[N];
int dp[N];
stack<int> s;
int main()
{
    int n,res=0;
    cin >> n;
    for(int i = 0; i < n; i ++) cin >> a[i];
    //前缀和便于快速求区间和,例如求[l,r]区间和=dp[r+1]-dp[l]。l和r的取值范围是[0,n)
    for(int i = 1; i <= n; i ++) dp[i] = dp[i-1] + a[i-1]; 
    for(int i = 0; i < n; i ++) {
        while(!s.empty() && a[i] <= a[s.top()]) {
            int peak = a[s.top()];
            s.pop();
            int l = s.empty()? -1 : s.top();
            int r = i; 
            //l和r是边界,因此区间是[l+1,r-1],其区间和dp[r+1]-dp[l]
            int dist = dp[r] - dp[l+1];
            res = max(res,peak*dist);
        }
        s.push(i);
    }
    while(!s.empty())
    {
        int peak = a[s.top()];
        s.pop();
        int l = s.empty()? -1 : s.top();
        int r = n; 

        int dist = dp[r] - dp[l+1];
        res = max(res,peak*dist);
    }
    cout << res << endl; 
}
#字节跳动##实习##面经##Java工程师#
全部评论
牛客题霸 可以看看
点赞 回复 分享
发布于 2021-02-25 13:28

相关推荐

04-04 21:01
已编辑
门头沟学院 前端工程师
楼主前端岗,目前在找暑期实习,求佬们帮忙选择一下,给个建议1.&nbsp;快手,base北京,效率工程部,负责内部协同文档,ai接入等等,应该是企业内部自用的系统,hr说保证秋招前有转正答辩机会,会评估个人产出和实习时长,对快手有滤镜,福利很好,听人说这个组不卷而且大老板人很好2.&nbsp;美团,base&nbsp;上海,点评事业部,负责搜索与美食展示,用的是内部自研语言,面试时说是大前端,纯前端的内容比较少,大部分情况下是自研语言开发移动端,少量客户端,楼主一点客户端也不会,但是转正概率高,面试官说只要愿意留表现不是太差的都会转正。但是因为用内部语言,想着实习方向上不垂直,感觉技术上帮助不大,另外点评事业部有的说好有的说快跑,不太知道详情3.&nbsp;字节,base&nbsp;北京,负责广告业务里的风控,安全等,hr面说因为没到hc盘点的时候,所以不保证有hc,但大概有,而且要看个人产出和表现,听说字节转正率不太高,一堆实习一两年的同学在等转正机会,楼主卷不过她们,而且听说很压力,另外因为没走官网,也不确定是不是暑期实习,但是宇宙厂title很大。听学长说广告业务很好,但是风控不太行,有没有佬懂的【求佬们给个意见,能从转正,发展前景上,以及转正offer选择&nbsp;技术岗&nbsp;求助offer选择&nbsp;找实习&nbsp;#&nbsp;offer
投递快手等公司8个岗位
点赞 评论 收藏
分享
&nbsp;黔中有一士,闻大厂召面,欣然投牒。既得笔试,排名中游,乃蹙然曰:“成黔不去面矣,恐为炮灰。”友人闻之,作《劝面》以励之。&nbsp;&nbsp;君子曰:面不可已。GPA者,所以呈绩也;八股者,所以验码也;群面者,所以考吹也。故绩不高则Offer不至,码不熟则AC难成,吹不利则HR弗叹。今之刷题者,利钝参半,然面败者众,何也?非题不熟也,怯也。&nbsp;&nbsp;夫大厂之门,非985不得入乎?非ACM不得进乎?然每岁之秋,双非上岸者亦众,何也?彼辈面多也。是故三线之校,可面Bat;二本之生,可战TMD。今汝笔试中游,是已具其基矣,然逡巡畏葸,是自弃也。&nbsp;&nbsp;吾尝见一士,绩不过3,无顶会无实习,日投三十家,凡面二十余,终得虾皮之聘。又有同窗,力扣千五,每败必复盘,卒进字节。彼二者,岂非天资过人哉?惟多面耳。&nbsp;&nbsp;今汝不面,是使HR之邮箱空置,猎头之KPI难成,内推者之心血虚掷也。且夫面试之道,初战多北,再面渐顺,三面知彼,四面得窍。故不积面经,无以致Offer;不历压力,无以镇场子。快手挂于一面,可战二面;腾讯折于群殴,再约单挑。&nbsp;&nbsp;嗟乎!拒信者,成长之资也;感谢信者,进步之阶也。今诸厂招人,犹饥鹰觅食,汝既入围,何惧为灰?且夫炮灰云者,不过未备耳。使汝日刷三题,周模二面,月积一厂,孰谓汝终为灰耶?&nbsp;&nbsp;是故卷不必ACM,达标则灵;历不必大厂,有货则行。今弃面而走,是自绝于福报也;强颜而往,或柳暗花明也。面霸与非酋,其皆出于此乎?&nbsp;&nbsp;黔士得文,惭而奋起,日刷力扣,周面三家。三月后,得中小厂Offer,虽非大鳄,亦脱浪里。君子曰:此劝面之功也。
点赞 评论 收藏
分享
评论
6
32
分享

创作者周榜

更多
牛客网
牛客企业服务