初学算法——最大子序列
2017-01-22 15:39
218 查看
以下三种实现方法不同,时间复杂度分别为N3,N2,N
public class MaxSonArr{ //三重For循环 public static int maxSonArr(int[] arr){ int maxSum = 0; for (int i = 0; i < arr.length; i++) {//i:子序列第一个数的位置 for (int j = i; j < arr.length; j++) {//j:子序列长度 int sum = 0; for (int k = i; k <= j; k++) {//累加;其实没必要,因为条件和第二层for循环实际上一摸一样的 sum += arr[k]; } if(maxSum<sum){ maxSum = sum; } } } return maxSum; } //二重For循环 public static int maxSonArr2(int[] arr){ int maxSum = 0; for (int i = 0; i < arr.length; i++) {//i:子序列第一个数的位置 int sum = 0; for (int j = i; j < arr.length; j++) {//j:子序列长度 sum += arr[j]; if(maxSum<sum){ maxSum = sum; } } } return maxSum; } //一重For循环 public static int maxSonArr3(int[] arr){ int maxSum = 0; int sum = 0; //由于不需要知道 for (int j = 0; j < arr.length; j++) { sum += arr[j]; if(maxSum<sum){ maxSum = sum; }else if(sum<0){//将当前已累加的值看做起点,负值的起点绝对不可能是最佳的,因为你可以将起点向后推进而得到改善 sum=0; } } return maxSum; } } 结果:6;
相关文章推荐