面试题42:连续子序列的最大和

2019-11-12  本文已影响0人  繁星追逐

输入一个整型数组,数组里正负数都可能有,数组中的一个或者连续的多个整数组成一个子数组。

思路一:
采用一个比较记录最大和,一个记录当前位置数组之前序列的和。如果前一个和小于0,避让比当前数字开始的子数组和要小,直接从当前位置再开始。
代码如下:

/**
     * 普通累加算法
     * @param array
     * @return
     */
    public static int FindGreatestSumOfSubArray(int[] array) {
        if (array == null || array.length == 0) return 0;
          int curSum = array[0];
          int maxSum = array[0];
          for (int i=1;i<array.length;i++){
              if (curSum < 0) curSum = array[i];
              else {
                  curSum += array[i];
              }
              if (curSum > maxSum) maxSum = curSum;
          }
          return maxSum;
    }

思路二:动态规划
赋初值以后,如果从当前数组第二个开始,每次只取当前和数组位置的累加和与当前数组值中最大的那个
最大和数值每次再取自身与当前数组和最大的一个。
最后返回最大和。

/**
     * 动态规划
     * @param array
     * @return
     */
    public static int FindGreatestSumOfSubArray1(int[] array) {
        if (array == null || array.length == 0) return 0;
        int curSum = array[0];
        int maxSum = array[0];
        for (int i=1;i<array.length;i++){
            curSum = Math.max(curSum+array[i],array[i]);
            maxSum = Math.max(curSum,maxSum);
        }
        return maxSum;
    }

    public static void main(String[] args) {
        int[] a = {6,-3,-2,7,-15,1,2,2};
        System.out.println(FindGreatestSumOfSubArray(a));
        System.out.println(FindGreatestSumOfSubArray1(a));
    }
上一篇下一篇

猜你喜欢

热点阅读