分治策略(求最大子数组和)

思想:

  1. 分治:将原问题分解为许多小问题,使小问题的形式与原问题相同,只是问题的规模更小。
  2. 求解:递归地求解出子问题,当子问题的规模足够小时,停止递归,解决问题。
  3. 合并:将子问题的解合并起来,组合成原问题的解。

例 求最大子数组和(leetcode 53T)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组 是数组中的一个连续部分。
示例 1:

输入:nums = -2,1,-3,4,-1,2,1,-5,4 输出:6 解释:连续子数组 4,-1,2,1 的和最大,为 6 。
示例 2:

输入:nums = 1 输出:1
示例 3:

输入:nums = 5,4,-1,7,8 输出:23


求解numslow,high的最大子数组,根据分治策略,将原问题分解成同等形式的小问题,则可以以中间(mid)为标准进行分割,分成numslow,mid 和num mid+1,high两个子数组,然后对每个子问题以此类推,直至子问题不可再分。此种情况下,numslow,high中的最大连续子数组numsi,j必然为以下三种情况之一:

  • 完全在 numslow,mid
  • 完全在numsmid+1,high
  • 跨越两个子数组,low < i < mid < j < high。

cpp 复制代码
class Solution {
public:
int maxCrossSum(vector<int>& nums,int low,int mid,int high)
{
    int leftSum = -2147483648;
    int sum = 0;
    for(int i = mid;i >=low;i--){
        sum += nums[i];
        if(sum > leftSum){
            leftSum = sum;
        }
    }
    int rightSum = -2147483648;
    sum = 0;
    for(int i = mid + 1;i <=high;i++){
        sum += nums[i];
        if(sum > rightSum){
            rightSum = sum;
        }
    }
    return leftSum + rightSum;
}

int maxLRSum(vector<int>& nums,int low,int high)
{
    if(low == high){
        return nums[low];
    }
    else{
        int mid = (low + high)/2;
        int leftArr = 0;
        leftArr = maxLRSum(nums,low,mid);
        int rightArr = 0;
        rightArr = maxLRSum(nums,mid + 1,high);
        int midArr = 0;
        midArr = maxCrossSum(nums,low,mid,high);
        if(leftArr >= rightArr && leftArr >= midArr){
            return  leftArr;
        }
        if(rightArr>= leftArr && rightArr >= midArr){
            return rightArr;
        }
        if(midArr>= leftArr&& midArr >= rightArr){
            return midArr;
        }
    }
    return 0;
}
int maxSubArray(vector<int>& nums) {
    int low = 0;
    int high = nums.size()-1;
    int sum = 0;
    sum = maxLRSum(nums,low,high);
    return sum;
	}
};
相关推荐
欧特克_Glodon12 分钟前
OpenCV计算机视觉开发入门与实践<十六>:图像边框和图像轮廓
c++·人工智能·opencv·计算机视觉
wuminyu26 分钟前
JDK21中FFM api的upcall回调机制解析
java·linux·c语言·jvm·c++
我变成萤火虫7 小时前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
余额瞒着我当琳11 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
ShineWinsu12 小时前
对于C++:布隆过滤器(bloomfilter)的详细解析
c++·面试·位图·位运算·布隆过滤器·海量数据·比特位
牛油果子哥q16 小时前
C++内存模型与深浅拷贝万字详解:栈堆静态内存布局、深浅拷贝底层差异、内存泄漏根治、拷贝崩溃踩坑、手写深拷贝实战
java·开发语言·c++
大鹏的NLP博客16 小时前
通用 Linux 嵌入式板端 C/C++ ABI 与 Glibc 依赖治理规范
linux·c++·交叉编译
ysa05103017 小时前
c++常用自带函数用法与注意
c++·笔记·算法
qq_1508419919 小时前
从CVI(C)到Pyside(python)/Qt(C++)/VS(C#)的一点吐槽
c++·qt·c#
鸿芯微控科技21 小时前
MFC模拟量信号异常怎么排查?0-5V、4-20mA接线与量程换算
c++·5g·mfc·故障排查·质量流量控制器·4-20ma·模拟量信号