笔试题练习(滴滴17年真题)

1.连续最大和

题目

一个数组有 N 个元素,求连续子数组的最大和。 例如:[-1,2,1],和最大的连续子数组为[2,1],其和为 3 

输入描述:
输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。
输出描述:
所有连续子数组中和最大的值。

题目分析

法一:可以找出规律,如果当前和小于0,那么可以把这个当前值抛弃,因为加上一个负数(包括0)还不如不加,把当前数设置为当前和。如果当前和是正数,则把当前数加进去更新当前和,这个时候判断下当前和是否大于最大连续和,是的话就更新最大连续和,否则,不更新最大连续和,只更新当前和。需要注意的是:需要设置一个布尔变量,判断是因为输入无效数据返回的0还是本身最大连续和就是0.

法二:用动态规划的算法。用f(i)表示第一个数字结尾的子数组的最大和,那么我们需要求出max{f(i)},其实0<=i<=n。然后用递归来解。代码同法一是一样的,max[f(i)]就是greatsum,f(i)就是cursum。

 f(i)  =data[i]                  i==0 ||  f(i-1)<=0

         =f(i-1)+data[i]     i!=0  && f(i-1)>0

代码

#include<iostream>
 
using namespace std;
 
#include<vector>
 
bool g_invalid= false ; //判断返回值为0 还是因为是无效数据返回的0
 
int getMax(vector< int > nums, int n)
{
     if (n<=0)
     {
         g_invalid= true ;
         return 0;
     }
 
    g_invalid= false ;
 
     int cursum=0;
     int greatsum=0x80000000;
     for ( int i=0;i<n;i++)
     {
         if (cursum<=0)
             cursum=nums[i];
         else
             cursum+=nums[i];
         if (cursum>greatsum)
             greatsum=cursum;
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值