题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例如输入的数组为{1,-2,3,10,-4,7,2,-5},和最大的子数组为{3,10,-4,7,2},因此输出为该子数组的和18。

代码实现:
public class Solution{ public static int findGreatestSumOfSubArray(int[] arr){ if(arr==null||arr.length==0){ return 0; } //累加的子数组和 int curSum=0; //最大的子数组和 int greatestSum=0; for(int i=0;i<arr.length;i++){ if(curSum<=0){ curSum=arr[i]; }else{ curSum+=arr[i]; } if(curSum>greatestSum){ greatestSum=curSum; } } return greatestSum; } public static void main(String[] args){ int[] arr={1,-2,3,10,-4,7,2,-5}; int sum=findGreatestSumOfSubArray(arr); System.out.println(sum); } }
与上面的原理一样的不同写法
public class Solution{ public static int findGreatestSumOfSubArray(int[] arr){ if(arr==null||arr.length==0){ return 0; } //保存累加子数组的和 int[] dp=new int[2]; dp[0]=arr[0]; //保存最大的子数组和 int max=arr[0]; for(int i=1;i<arr.length;i++){ dp[i&1]=Math.max(arr[i],arr[i]+dp[(i-1)&1]); max=Math.max(max,dp[i&1]); } return max; } public static void main(String[] args){ int[] arr={1,-2,3,10,-4,7,2,-5}; int sum=findGreatestSumOfSubArray(arr); System.out.println(sum); } }
n&1结果要么是1,要么是0。可以用来判断n是奇数还是偶数。
posted on
浙公网安备 33010602011771号