欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 【LeetCode】算法详解#3 ---最大子数组和

【LeetCode】算法详解#3 ---最大子数组和

2025/4/19 2:55:25 来源:https://blog.csdn.net/2402_84949062/article/details/147030626  浏览:    关键词:【LeetCode】算法详解#3 ---最大子数组和

1.题目介绍

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

子数组是数组中的一个连续部分。

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104

2.解决思路

        要求出一个数组中和最大的子数组的和,这通常有很多种解法,比如暴力遍历、分治、动态规划等,我这里采用动态规划去解决,具体思路如下:既然要求出和最大的值,那么肯定要有一个变量f1用来记录最大的值,至于如何求出最大的值是多少,我们可以采用循环比较的方法不断取 i 和i-1 之间的最大值,并用临时值记录f2下来,如果数组从前向后不断增大,那么显而易见这个临时值f2表示的就是当前位置 i 的前缀和,也就是当前的最大和的数组,并不断将这个最大值赋值给f1。若遍历过程中出现了一个负数,中间值会变小。最大值f1通过比较仍取相对大的原值,也就是f1记录的永远是最大和子数组。然后中间值继续向后遍历,同样的逻辑,比f1更大则赋值给f1,比f1小则继续向后遍历,最终f1记录的就是和最大的子数组的和。

3..步骤讲解

        1.定义maxSum记录最大数组和,currentSum记录遍历过程中的临时值

        2.遍历数组

        3.不断比较当前遍历到的值与临时值+当前遍历值的大小,取最大值

        4.临时值与最大值进行比较,保持maxSum永远记录最大值

        5.返回结果

4.代码展示      

public int maxSubArray(int[] nums) {//记录最大值int maxSum = nums[0];//记录中间值int currentSum = nums[0];for (int i = 1; i < nums.length; i++) {//比较临时值增大还是减小currentSum = Math.max(nums[i], currentSum + nums[i]);//永远保持记录最大值maxSum = Math.max(maxSum, currentSum);}return maxSum;
}

5.执行结果

在leetcode测试用例中平均耗时1ms

内存分布56.11MB

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词