Leetcode 53——Suma máxima de subarreglos (Python)

[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】

 

Supongo que te gusta

Origin blog.csdn.net/m0_48936146/article/details/124869449
Recomendado
Clasificación