题目

给出一个长度为 n 的数组a1、a2、...、ana1、a2、...、an,请找出在所有连续区间 中,区间和最大同时这个区间 0 的个数小于等于 3 个,输出这个区间和。

  • 输入描述: 
    第一行一个正整数 n, 表示数组长度,1 <= n <= 1000000。 
    第二行 n 个正整数,a1a2...ana1a2...an,其中 -1e9 <= a1、a2、...、ana1、a2、...、an <= 1e9

  • 输出描述: 
    一个整数

  • 示例1:

    输入 

    1 2 3 4 5 
    输出 
    15

  • 示例2:

    输入 

    15 0 0 0 0 20 
    输出 
    20

  • 思路:

    此问题为最大连续区间和的扩展,多增加了一个区间内 0 的个数不超过 3 的限制。 可以利用动态规划或者最简单的线性方法先解决最大区间和问题,再附加一个判断即可。

  • 代码实现

#include <iostream>
using namespace std; int MaxSubArray(int nums[], int n); int main()
{
int n = ;
cin >> n; int num[n];
for(int i = ; i < n ; i++)
{
cin >> num[i];
} cout << MaxSubArray(num, n); } int MaxSubArray(int num[], int n)
{
int i = , sum = , max_sum = ;
int temp_sum[] = {};
int temp = ;
int zero_num = ;
for(i = ; i < n; i++)
{
sum += num[i];
/* 累加求和,只要和非负,就不会使得再相加的和变小,也就是对和的增加有贡献,就可以继续累加 */
if(num[i] == )
{
zero_num++;
temp_sum[zero_num-] = sum;
/*保存每次遇到 0 时的区间和*/
} /* 增加一个对区间内 0 个数的判断 */
if(sum > max_sum && zero_num <= )
{
max_sum = sum;
} /*和为负,清零,重新开始*/
if(sum < )
{
sum = ;
zero_num = ;
temp_sum[] = ;
temp_sum[] = ;
temp_sum[] = ;
temp_sum[] = ;
} /*遇到第四个 0 时对区间和进行更新,以第一个 0 后的数作为起点重新开始*/
if(zero_num > )
{
zero_num -= ;
sum = sum - temp_sum[];
temp = temp_sum[];
temp_sum[] = temp_sum[] - temp;
temp_sum[] = temp_sum[] - temp;
temp_sum[] = temp_sum[] - temp;
temp_sum[] = sum;
}
} return max_sum;
}

个人见解,如有错误,欢迎指正与交流!

获取更多精彩,请关注「seniusen」! 

今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第一道——最大连续区间和扩展的更多相关文章

  1. 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第一道——最佳路径

    题目 给定一个 n*m 的矩阵 A ,矩阵中每一个元素为一个十六进制数.寻找一条从左上角都右下角的路径,每次只能向右或者向下移动, 使得路径上所有数字之积在 16 进制下的后缀 0 最少. 输入描述: ...

  2. 今日头条 2018 AI Camp 5 月 26 日在线笔试编程题第二道——最小分割分数

    题目: 给 n 个正整数 a_1,…,a_n, 将 n 个数顺序排成一列后分割成 m 段,每一段的分数被记为这段内所有数的和,该次分割的分数被记为 m 段分数的最大值.问所有分割方案中分割分数的最小值 ...

  3. 今日头条 2018 AI Camp 6 月 2 日在线笔试编程题第二道——两数差的和

    题目 给 n 个实数 a_1, a_2 ... a_n, 要求计算这 n 个数两两之间差的绝对值下取整后的和是多少. 输入描述 第一行为一个正整数 n 和一个整数 m.接下来 n 行,第 i 行代表一 ...

  4. 今日头条 2018 AI Camp 视频面试

    1. 本次面试是在牛客网平台进行的,没有涉及到技术细节,面试官也说仅仅是聊天.但是,不知道是网络卡顿还是平台缘故,连接非常不稳定,经常听不到声音,对方那边噪音也特别大,面试体验不是很好. 2. 面试时 ...

  5. 链家2018春招C/C++开发实习生在线考试编程题

    题目一 题解:该题目意思就是让你输入n组数据,然后求并集,利用STL容器set集合的特性:元素不重复存储,我们可以很轻易得出答案 #include <iostream> #include ...

  6. 今日头条 CEO 张一鸣:面试了 2000 个年轻人,混得好的都有这 5 种特质

    https://blog.csdn.net/qq_35246620/article/details/72801285 博主说:多了解了解总是好的. 正文 张一鸣算是 80 后中绝对的佼佼者.1983 ...

  7. 2019年IntelliJ IDEA 最新注册码,亲测可用(截止到2020年3月11日)

    2019年IntelliJ IDEA 最新注册码(截止到2020年3月11日) 操作步骤: 第一步:  修改 hosts 文件 ~~~ 在hosts文件中,添加以下映射关系: 0.0.0.0 acco ...

  8. 2018春招-今日头条笔试题-第四题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) #-*- coding:utf-8 -*- class Magic: ''' a:用于存储数组a b:用于存储数组b num:用于 ...

  9. 2018春招-今日头条笔试题-第三题(python)

    题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出‘1234567890’,对于输入表达试获得对应的结果利用python内置函数eval ...

随机推荐

  1. center os 7 修改 mysql 密码

    笔记 本redis 密码 654321忘记密码:修改密码update user set authentication_string=password('123456') where user='roo ...

  2. SQL SERVER 对权限的授予GRANT、拒绝DENY、收回REVOKE

    -----对用户member授权,允许其具有对数据表person的更新和删除的操作权限:GRANT UPDATE,DELETE ON personTO member WITH GRANT OPTION ...

  3. hdu_4135_Co-prime

    Given a number N, you are asked to count the number of integers between A and B inclusive which are ...

  4. Linux-帮助的用法

    Linux帮助使用方法 内部命令:help COMMAND 或 man bash外部命令: (1) COMMAND --help   COMMAND -h --help和-h选项显示用法总结和参数列表 ...

  5. 附件上传——mysql blob类型的数据(springboot)1

    作为一个初出茅庐的菜鸟,这几天做了一下附件的上传与下载,附件文件存储在mysql中,数据类型为blob.在此做一下总结.望指正. 一.先总结附件的上传.(实质是将文件传到controller,后处理成 ...

  6. js判断当前浏览器是否是源生app的webview

    有些时候,我们在开发过程中需要判断,当前页面被打开是否是处于源生的webview里面,或者NODEJS做服务器后端支持的时候,判断请求来源是否来至于源生webview里面被打开的页面请求GET/POS ...

  7. day 21继承

    1.了解Python2和python3类的区别:   python2.3之前使用的是经典类, 在2.3版本之后组,使用的是新式类 MRO: method resolution order  方法的查找 ...

  8. C语言实现左旋字符串

    #include<stdio.h> #include<stdlib.h> #include<string.h> void left_rotate(char *str ...

  9. Qt——父对象、布局

    设置父对象两个好处:(1)加入析构树(2)和父对象一起显示 设置布局后,子控件自动被设置父对象 设置父对象两个好处:(1)加入析构树(2)和父对象一起显示

  10. Noip 2011 Day 1 & Day 2

    Day 1   >>> T1   >> 水题一道 . 我们只需要 for 一遍 , 由于地毯是从下往上铺的 , 我们只需要记录该位置最上面的地毯的编号 , 每一次在当前地 ...