牛客网在线编程(21):连续最大和-python

本文介绍了一道滴滴2017年的面试题目及其2018年变种题目的解决方案。主要内容包括求解连续子数组的最大和,以及在允许修改一定数量元素符号的情况下,寻找连续子数组和的绝对值最大值。提供了详细的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

序言

这是2017年滴滴的一道题目,但是2018年出现了它的变种题目,我会同时为大家提供出本题和变种后题目的代码

题目描述

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

输入描述:

输入为两行。 第一行一个整数n(1 <= n <= 100000),表示一共有n个元素 第二行为n个数,即每个元素,每个整数都在32位int范围内。以空格分隔。

输出描述:

所有连续子数组中和最大的值。

示例1

输入

3 
-1 2 1

输出

3

代码实现 

n=input()
lis=list(map(int,input().split()))

def func(lis):
    result=lis[0]
    tem=0
    for item in lis:
        if tem<0:
            tem=item
        else:
            tem+=item
        result=max(result,tem)
    return result
print(func(lis))

进阶题目描述

这次我们不直接去找最大的连续和,而是可以先将数组中的若干个数字变换符号(正数变为负数或者负数变为正数),然后找出连续的数的和的绝对值最大为多少?

这时候第1行 输入为两个数n,k,其中k为最多更改符号的次数。

还以上面的示例为例,假如k为1,那么我们可以将-1改为1,最后的结果就为4.

再给几个示例:k=1时,-5 -3 1返回结果9(将1改为-1,那么-5-3-1=-9,再取绝对值就是9)

k=2时,-1 -2 -3 -4 返回结果7

代码实现

n,num=map(int,input().split())
lis=list(map(int,input().split()))

def qufan(x):
    return -x

def func(lis,num=0,flag=False):  #num为可以最多更改的次数,默认是0,flag是要不要对数组中所有的数取反,默认是Flase
    if flag:
        lis=list(map(qufan,lis))
    result=lis[0]
    flg=1
    while True:
        tem=0
        flg_=0
        num_=num
        for item in lis:
            if item<0:
                flg_+=1
                if num_>0 and flg-flg_<=0:
                    item=abs(item)
                    num_-=1
            if tem<0:
                tem=item
            else:
                tem+=item
            result=max(result,tem)
        flg+=1
        if num_>0 or num==0:
            break
    return result
print(str(max(func(lis,num,True),func(lis,num))))

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值