题解 | #连续子数组的最大和#
连续子数组的最大和
http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484
代码一(看题解写出来)
注意:描述引用他人的,代码自己的
【剑指offer】连续子数组的最大和
典型的动态规划。dp[n]代表以当前元素为截止点的连续子序列的最大和,如果dp[n-1]>0,dp[n]=dp[n]+dp[n-1],因为当前数字加上一个正数一定会变大;如果dp[n-1]<0,dp[n]不变,因为当前数字加上一个负数一定会变小。使用一个变量max记录最大的dp值返回即可。
public static int fun02(int[] arr) { if(arr == null || arr.length == 0) return 0; if(arr.length == 1) return arr[1]; int max = arr[0]; int sum = arr[0]; for (int i = 1;i < arr.length;i ++) { sum = sum > 0 ? sum + arr[i] : arr[i]; max = max > sum ? max : sum; } return max; }
代码二(代码一扩展,记录左右下标)
public static int fun03(int[] arr) { if(arr == null || arr.length == 0) return 0; if(arr.length == 1) return arr[1]; int max = arr[0]; int sum = arr[0]; int left = 0; int right = 0; for (int i = 1;i < arr.length;i ++) { if (sum > 0) { sum = sum + arr[i]; } else { sum = arr[i]; left = i; } max = max > sum ? max : sum; right = i; } return max; }
代码三(自己肝出来)
public static int fun(int[] arr) { if(arr == null || arr.length == 0) return 0; if(arr.length == 1) return arr[1]; int max = arr[0]; int sum = arr[0]; //int left = 0; //int right = 0; for(int i = 1;i < arr.length;i ++) { int temp = sum + arr[i]; if(temp > sum) { if (temp > arr[i]) { sum = temp; } else { sum = arr[i]; //left = i; } } else { max = max > sum ? max : sum; if(temp > arr[i]) { sum = temp; } else { sum = arr[i]; //left = i; } } //right = i; } return max > sum ? max : sum; }