LeetCode 53. Максимальный подмассив

Sol динамического программирования: O (n)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int max_so_far = INT_MIN, max_tmp = 0;
        
        for (int elem : nums) {
            max_tmp += elem;
            max_so_far = max(max_tmp, max_so_far);
            if (max_tmp < 0) {
                max_tmp = 0;
            }            
        }
        return max_so_far;
    }
};

Разделяй и властвуй Соль: O(n)

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        return divide_and_conquer(nums, 0, nums.size() - 1);
    }
    
    int divide_and_conquer(vector<int>& nums, int left, int right) {
        if (left > right) {
            return INT_MIN;
        }
        
        int mid = left + (right - left) / 2, max_left_tmp = 0, max_right_tmp = 0;
        
        int left_max = divide_and_conquer(nums, left, mid - 1);
        int right_max = divide_and_conquer(nums, mid + 1, right);
        
        for (int i = mid - 1, sum = 0; i >= left; i--) {
            sum += nums[i];
            max_left_tmp = max(max_left_tmp, sum);
        }
        
        for (int i = mid + 1, sum = 0; i <= right; i++) {
            sum += nums[i];
            max_right_tmp = max(max_right_tmp, sum);
        }
        
        return max(max(left_max, right_max), max_left_tmp + max_right_tmp + nums[mid]);
    }
};