第一种:
设置初始sum为0。从左往右加,并更新最值。当sum小于0时候,此时再往右加,只会让后面更小,因此sum设置为0;时间复杂度是o(n)。空间复杂度是o(1)。
public int maxsumofSubarray (int[] arr) { // write code here int sum =0; int res = Integer.MIN_VALUE; for(int a:arr){ if(sum<0) sum=0; else { sum+=a; res = Math.max(res,sum); } } return res; }
第二种:
可以使用前缀和,然后从左往右遍历,每次更新最小的前缀和。每遍历一次,用当前的前缀和-当前最小的前缀和,并更新最大值。时间复杂度是o(n),空间复杂度是o(n);