记录十——最大子数组

本文探讨了一种在整数数组中寻找连续子数组并计算其最大和的问题,通过实例[-2,1,-3,4,-1,2,1,-5,4]展示了如何找到最大和为6的子数组[4,-1,2,1]。文章提供了基于暴力破解的解决方案,但指出其时间复杂度较高,为O(n^3),并暗示了更优解的存在。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最大子数组

题:给出一个整数数组nums,找到一个有最大和的连续子数组(至少包含一个值),并返回最大值
例:Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Explanation: [4,-1,2,1] has the largest sum = 6.


思路:这是我研究生复试机试的最后一题,只是多了一些输出,要求输出最大子数组的起始点索引和末尾索引。虽然中间没有接触到这道题,但是现在再次做到此题,感觉之前在考试时做的不理想真的是不应该,最简答的方法就是使用暴力破解,但是时间复杂度太高。
代码:

class Solution {
    public int maxSubArray(int[] nums) {
        int max = nums[0];
        //int sum = 0;
        for(int i = 0;i < nums.length;i++){
            for(int j = i;j < nums.length;j++){
                int sum = 0;
                for(int z = i;z <= j;z++){
                    sum += nums[z];
                }
                max = Math.max(max,sum);
            }
        }
        return max;
    }
}

时间复杂度:O(n3),空间复杂度:O(1)

### LeetCode 最大子数组和问题解决方案 #### 定义与目标 对于给定的一个整数数组 `nums`,目的是找到一个具有最大和的连续子数组(至少包含一个元素),并返回该子数组最大可能和[^2]。 #### 动态规划方法解析 为了有效地解决问题,采用动态规划是一种常见策略。这里的关键在于定义合适的子问题来简化原始问题。具体来说,考虑「`nums[0..k)` 中以最后一个元素结尾的最大子数组和」作为子问题的形式[^1]。这样做的好处是可以逐步累积之前的结果,从而避免重复计算。 基于上述思路,状态转移方程可表达如下: 设 `dp[i]` 表示以第 i 个位置结束的最大子序列之和,则有: \[ dp[i]=\max(dp[i-1]+nums[i], nums[i]) \] 初始条件设定为第一个元素本身即 `dp[0] = nums[0]`。最终所求的答案就是整个过程中出现过的最大的那个 `dp[i]` 值。 ```python def maxSubArray(nums): n = len(nums) if not nums or n == 0: return 0 # 初始化当前最大值以及全局最大值均为首项 current_sum = global_max = nums[0] for num in nums[1:]: # 更新当前最大值 current_sum = max(num, current_sum + num) # 如果当前最大值大于全局记录下的最大值则更新它 if current_sum > global_max: global_max = current_sum return global_max ``` 这种方法的时间复杂度为 O(n),空间复杂度可以通过只保存两个变量而优化至 O(1)[^3]。 #### 思维扩展 除了掌握具体的编程技巧外,更重要的是学习如何将实际生活中的难题抽象成计算机能够处理的小片段——就像本题目里那样把整体分割成更易于管理的部分,并通过这些部分之间的关系推导出完整的解答过程[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值