ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-06-10 13:53:55  阅读:197  来源: 互联网

标签:... temp AI sum Camp int num 2018 区间


题目

给出一个长度为 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 = 0;
    cin >> n;

    int num[n];
    for(int i = 0; i < n ; i++)
    {
        cin >> num[i];
    }

    cout << MaxSubArray(num, n);

}

int MaxSubArray(int num[], int n)
{
    int i = 0, sum = 0, max_sum = 0;
    int temp_sum[4] = {0};
    int temp = 0;
    int zero_num = 0;
    for(i = 0; i < n; i++)
    {
        sum += num[i];
        /* 累加求和,只要和非负,就不会使得再相加的和变小,也就是对和的增加有贡献,就可以继续累加 */
        if(num[i] == 0)
        {
            zero_num++;
            temp_sum[zero_num-1] = sum;
            /*保存每次遇到 0 时的区间和*/
        }

        /* 增加一个对区间内 0 个数的判断 */
        if(sum > max_sum && zero_num <= 3)
        {
            max_sum = sum;
        }

        /*和为负,清零,重新开始*/
        if(sum < 0)
        {
            sum = 0;
            zero_num = 0;
            temp_sum[0] = 0;
            temp_sum[1] = 0;
            temp_sum[2] = 0;
            temp_sum[3] = 0;
        }

        /*遇到第四个 0 时对区间和进行更新,以第一个 0 后的数作为起点重新开始*/
        if(zero_num > 3)
        {
            zero_num -= 1;
            sum = sum - temp_sum[0];
            temp = temp_sum[0];
            temp_sum[0] = temp_sum[1] - temp;
            temp_sum[1] = temp_sum[2] - temp;
            temp_sum[2] = temp_sum[3] - temp;
            temp_sum[3] = sum;
        }
    }

    return max_sum;
}

 

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


这里写图片描述

   

标签:...,temp,AI,sum,Camp,int,num,2018,区间
来源: https://blog.51cto.com/u_15265149/2889315

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有