[requisitos del tema]
Dada una matriz de números enteros, busque una submatriz continua con la suma más grande (la submatriz contiene al menos un elemento) y devuelva su suma más grande.
Un subarreglo es una parte contigua de un arreglo.
Ejemplo 1:
Entrada: nums = [-2,1,-3,4,-1,2,1,-5,4]
Salida: 6
Explicación: La suma de subarreglos consecutivos [4,-1,2,1] es la mayor , que es 6.
Ejemplo 2:
entrada: números = [1]
salida: 1
Ejemplo 3:
Entrada: números = [5,4,-1,7,8]
Salida: 23
【Ideas para resolver problemas】
Concepto central: la programación es en realidad usar computadoras para lograr cosas que los humanos pueden lograr.
Por lo tanto, la resolución de problemas puede seguir la idea de "derivación artificial - de individual a grupo - de especial a general", es decir, derivar soluciones generales a partir de casos individuales.
El manejo de esta pregunta necesita ser un poco más flexible. Tome [-2, 1, -3, 4, -1, 2, 1, -5, 4] como ejemplo. Si lo hacemos manualmente, parece que No tenemos ni idea por un tiempo. . Pero según la experiencia, al menos podemos saber que si todos los elementos de una matriz son números positivos, obviamente la submatriz más grande y continua es ella misma, es decir, debemos poner tantos números positivos como sea posible en la matriz. último subconjunto requerido. Luego iteramos a través de la matriz de forma rutinaria:
R1:首先拿出-2,由于这是第一个数字,手头上拿出来的没有其他数字了,所以目前最大是-2
R2:接着拿出1,可以发现,[-2, 1]这个子数组的和是-1,比R1的最大结果要大,但是,如果我们只拿1,
把前面的-2丢掉,是不是更大了,-2<(-2+1)<1,那此时最大和子数组应该是[1]
R3:拿出-3,如果放到前面的最大和子数组中变成[1, -3]显然结果更小了,所以最大子数组还是[1]
R4:继续拿出4,显然单是一个4就比前面的最大和子数组[1]要大了,这时候得想想,能不能让1和4加到一起
呢,毕竟1+4=5,只要两者中间的元素不捣乱,那最大值就又能变大了,那我们再考虑把之前丢掉的-3拿
回来,组成[1, -3, 4],和为2,显然现在max更新成[4],4前面的元素都得丢掉,毕竟加上了结果反而
更小
R5:接下来拿出-1,显然-1<4,最大和子数组为[4],继续遍历
R6:拿出2,2<4,最大和子数组是[4],但是这时候还是得想想,能不能让4和2加到一起呢,如果二者中间的
元素识相,那最大值就又变大了,那我们再考虑把之前丢掉的-1拿回来组成[4, -1, 2],和为5,显然现
在max更新成[4, -1, 2],虽然二者中间的不是正数,但是组合起来的子数组和还是变大了一丢丢的
R7:当前拿出来的是1,是个正数,显然加上去max可以更新为[4, -1, 2, 1]
R8:接下来拿出-5,前面的值加上-5就变小了,所以最大和子数组不变
R9:最后一个是4,考虑一下能不能让4也加进去呢,但因为是连续子数组,所以还得把前面的-5也加上,子数组变成[4, -1, 2, 1, -5, 4],比原先的最大和子数组要小,那么到这里,遍历完数组之后,结果就是[4, -1, 2, 1],值为6。有没有发现,上述的过程中我们一直在考虑当前遍历到一个元素时,到底需不需要把该元素之前的最大值加进去,但是由于是连续子数组,还需考虑当前值和当前值之前最大值二者之间的元素,比如遍历到4的时候,考虑要不要加上前面的最大值1,但是连续子数组就变成了[1, -3, 4],更小了,所以不需要加上之前的值,那么转换成代码可以写成:
【Ejecutar código】
class Solution(object):
def maxSubArray(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
# 定义prev用于存储当前元素之前的最大值
prev = 0
# 初始化结果变量
res = -int(1e9)
# 遍历数组
for li in nums:
# 每次更新当前元素及其之前的最大值,这里可以拿实例手动推导一下,会发现跟前面的推导
# 流程是一样的,这里的max(prev+li, li)就是实现了每次考虑是否加上前面的最大值,但是
# 同时还需要加上二者之间的元素,比如遍历到4,前面最大的元素是1, 由于上一步遍历到-3
# 时,最大值是1-3=-2,所以此时的prev是-2,那显然max(-2+4, 4)结果为4
prev = max(prev+li, li)
# 更新最大结果
res = max(res, prev)
return res
【resultado de la operación】