欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

java-数组最大子序和

时间:2023-06-15

给定一个数组a,求最大子序和:

设一个变量sum,用它来储存子序和,比较暴力的办法是求出当前数组所有可能的子序的和再从中找到最大值。

设置一个变量sum,给sum一个初始值0;设一个变量ans,初始值a[0];用它来返回最大值;如果a只有一个数字,那么当前的sum就是最大子序和;但是如果a不止只有一个数字呢,怎样确定sum最大值呢?

数组中的数字可能是负数,0,正数。假如我们这样:sum从a[0]开始加,遇到正数或0时sum=sum+a[i];遇到负数时,当前的sum就该停止了,此时的ans=max(ans,sum)sum从停止位置的下一位置开始(指下一个遇到的正数或0)重新加起,直到遇到下一负数ans =max(ans,sum);以此类推,我们就会得到最大子序和。 但是这种方法并不能满足数组中全是负数的情况。

!!! 以下是正解 !!!
现在我们这样想:我们不去想sum+a[i]求最大值,我们去想a[i]+sum 求最大值,那么问题的关键就变成了sum的正负。**如果sum>0,那么sum=sum+a[i],如果sum<0,sum=a[i];ans=max(ans,sum);**这样即使数组全是负数也可以求出答案。

class Solution17 { public int maxSubArray(int[] nums) { int ans=nums[0]; int sum=0; for(int num:nums){ if(sum>0) { sum+=num; }else{ sum=num; } ans=Math.max(ans,sum); } return ans;} }

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。