【最大子数组和】问题具体思路——【循环暴搜】【贪心】【动态规划】【分治】(附完整代码)


前言

本文将围绕【最大子数组和】问题展开讨论。

对于这一问题将采用多种思路方法来解决

【循环暴搜】【贪心】【动态规划】【分治】


一、如何理解【最大子数组和】?

题目链接: [点击跳转] Leetcode 53. 最大子数组和

题目如下:

请添加图片描述
这是一道经典的数组题,可以尝试多种方法来解决。


二、方法一(循环暴搜)

(方法一时间复杂度高易超时,也可从方法二开始浏览)

在读过题之后,我们很容易就会想到:

既然是找子数组,那么我们就可以做一个嵌套循环,一个双层的循环就可以表示任意一个含两个元素的子数组了。

就像这样:

for(int i=0;i<size;i++){
   
    for(int j=i+1;j<size;j++){
   

    }
}//(一个指向子数组开头,一个指向子数组末尾)

在这个嵌套循环进行的过程中,将元素累加起来,并记录下最大的子数组。

最后在找一遍单个元素的子数组,取最大,就OK啦!

代码如下:

class Solution {
   
public:
    int maxSubArray(vector<int>& nums) {
   
        int sum=0;//子数组和
        int size=nums.size();//数组大小
        int maxsum=INT_MIN;//表示最大子数组

        //判断两个及以上的相邻元素
        for(int i=0;i<size;i++){
   
            sum+=nums[i];
            for(int j=i+1;j<size;j++){
   
                sum+=nums[j]</
### 分治法解决最大子数组问题的伪代码 以下是基于分治法求解最大子数组问题的伪代码: ```plaintext FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high) left-sum = -∞ sum = 0 max-left = mid for i = mid downto low sum = sum + A[i] if sum > left-sum left-sum = sum max-left = i right-sum = -∞ sum = 0 max-right = mid + 1 for j = mid + 1 to high sum = sum + A[j] if sum > right-sum right-sum = sum max-right = j return (max-left, max-right, left-sum + right-sum) FIND-MAXIMUM-SUBARRAY(A, low, high) if high == low return (low, high, A[low]) // 基本情况:仅有一个元素 else mid = floor((low + high) / 2) (left-low, left-high, left-sum) = FIND-MAXIMUM-SUBARRAY(A, low, mid) (right-low, right-high, right-sum) = FIND-MAXIMUM-SUBARRAY(A, mid + 1, high) (cross-low, cross-high, cross-sum) = FIND-MAX-CROSSING-SUBARRAY(A, low, mid, high) if left-sum >= right-sum and left-sum >= cross-sum return (left-low, left-high, left-sum) elseif right-sum >= left-sum and right-sum >= cross-sum return (right-low, right-high, right-sum) else return (cross-low, cross-high, cross-sum) ``` 上述伪代码分为两个主要函数 `FIND-MAX-CROSSING-SUBARRAY` `FIND-MAXIMUM-SUBARRAY`。前者用于找到跨越中点的最大子数组,后者则递归调用自身来处理左侧右侧子数组,并最终比较三者的最大值[^4]。 #### 关键点解析 - **基本思路** 将数组划分为左右两部分,分别递归求解每部分的最大子数组,再单独计算跨越中间位置的最大子数组。最后返回这三个结果中的最大者作为全局最优解[^3]。 - **时间复杂度** 此方法的时间复杂度为 \(O(n \log n)\),其中每次划分操作需要线性时间 \(O(n)\),而递归树的高度为 \(O(\log n)\)[^1]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值