题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为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 2018-11-14 20:58  会飞的金鱼  阅读(121)  评论(0)    收藏  举报