package com.raylew.algorithm.book1; /* 求一个数组中和最大的连续子数组 */ public class 最大子数组 { public static int[] arr = {13, -3, -25, -20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7}; public static int max_left_index; public static int max_right_index; public static int left_sum; public static int right_sum; public static int cross_sum; public static void main(String[] args) { findMax(0, arr.length - 1); System.out.println(left_sum + "," + right_sum + "," + cross_sum); System.out.println(max_left_index + "," + max_right_index); } public static void findMax(int low, int high) { if (low < high) { int mid = (low + high) / 2; findMax(low, mid); findMax(mid + 1, high); findCrossMax(low, mid, high); } } public static void findCrossMax(int low, int mid, int high) { left_sum = Integer.MIN_VALUE; int sum = 0; for (int i = mid; i >= low; i--) { sum += arr[i]; if (left_sum < sum) { left_sum = sum; max_left_index = i; } } right_sum = Integer.MIN_VALUE; sum = 0; for (int i = mid + 1; i <= high; i++) { sum += arr[i]; if (right_sum < sum) { right_sum = sum; max_right_index = i; } } cross_sum = left_sum + right_sum; } }