LeetCode53 | Suma máxima de suborden

Dados los números de una matriz entera, busque una submatriz continua con la suma más grande (la submatriz contiene al menos un elemento) y devuelva la suma más grande.

Ejemplo:

Entrada: [-2,1, -3,4, -1,2,1, -5,4],
Salida: 6

Explicación: La suma de submatrices consecutivas [4, -1,2,1] es la más grande, que es 6.


     Para conocer el método de encontrar la submatriz más grande, puede consultar este artículo, que habla de tres métodos: recursividad y dividir y conquistar / DP secuencial | problema de la submatriz más grande .

     Utilizo un algoritmo simple de dividir y conquistar, el código de CA es el siguiente:

#include <algorithm>
using namespace std;

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        return findMaxSubarray(nums, 0, nums.size() - 1);
    }

    int findMaxSubarray(vector<int>& a, int s, int e) {
        if(s == e)  //递归的终点
            return a[s];

        int mid = (s + e) / 2;

        int leftAns = findMaxSubarray(a, s, mid);  //计算含mid的左侧答案
        int rightAns = findMaxSubarray(a, mid + 1, e);  //计算不含mid的右侧答案
        int midAns = findMAxCrossingSubarray(a, s, mid, e);  //计算含mid的答案
        
        return max(midAns, max(leftAns, rightAns));
    }

    /* 在数组a[l,r]内找到包含m下标位置的最大子数组 */
    int findMAxCrossingSubarray(vector<int>& a, int l, int mid, int r) {
        //左边
        int leftMax = a[mid], cur = a[mid];
        for(int i = mid - 1; i >= l; i--) {
            cur += a[i];
            leftMax = max(cur, leftMax);   //更新最大答案
        }
        //右边
        int rightMax = a[mid];
        cur = a[mid];
        for(int i = mid + 1; i <= r; i++) {
            cur += a[i];
            rightMax = max(cur, rightMax);
        }

        return leftMax + rightMax - a[mid];
    }
    
};

Supongo que te gusta

Origin blog.csdn.net/weixin_43787043/article/details/106935575
Recomendado
Clasificación