[Java] Java求数组的子数组之和的最大值 →→→→→进入此内容的聊天室

来自 , 2019-06-27, 写在 Java, 查看 106 次.
URL http://www.code666.cn/view/7b9d31aa
  1. // 输入一个整形数组,数组里有正数也有负数。
  2. // 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
  3. // 求所有子数组的和的最大值。要求时间复杂度为O(n)。
  4. public class Test
  5. {
  6.     static int[] arr =
  7.     {
  8.             1, -2, 3, 10, -4, 7, 2, -5
  9.     };// 需要求的数组
  10.     static int maxIndex = arr.length - 1;// 数组的最大下标
  11.  
  12.     public static void main(String[] args)
  13.     {
  14.         findMaxArr2();
  15.         System.out.println("\n-------------");
  16.         findMaxArr3();
  17.     }
  18.  
  19.     // 1.三层for循环求解
  20.     // 2.二层for循环求解
  21.     static void findMaxArr2()
  22.     {
  23.         int max = arr[0];// 最大值
  24.         int sum;// 求和
  25.         int startIndex = 0;
  26.         int endIndex = 0;
  27.         for (int i = 0; i <= maxIndex; i++)
  28.         {
  29.             sum = 0;
  30.             for (int j = i; j <= maxIndex; j++)
  31.             {
  32.                 sum += arr[j];
  33.                 if (sum > max)
  34.                 {
  35.                     max = sum;
  36.                     startIndex = i;
  37.                     endIndex = j;
  38.                 }
  39.             }
  40.         }
  41.         System.out.println("最大值为:" + max);
  42.         printArr(startIndex, endIndex);
  43.     }
  44.  
  45.     // 3.时间复杂度为n
  46.     static void findMaxArr3()
  47.     {
  48.         int max = arr[0];// 最大值
  49.         int sum = 0;// 求和
  50.         int startIndex = 0;
  51.         int endIndex = 0;
  52.         for (int i = 0; i <= maxIndex; i++)
  53.         {
  54.             if (sum >= 0)
  55.             {
  56.                 sum += arr[i];
  57.             }
  58.             else
  59.             {
  60.                 sum = arr[i];
  61.                 startIndex = i;// 最大子数组开始值
  62.             }
  63.             if (sum > max)
  64.             {
  65.                 max = sum;
  66.                 endIndex = i;// 最大子数组结束值
  67.             }
  68.         }
  69.         System.out.println("最大值为:" + max);
  70.         printArr(startIndex, endIndex);
  71.     }
  72.  
  73.     // 根据下标开始结束值,打印数组
  74.     static void printArr(int startIndex, int endIndex)
  75.     {
  76.         for (int i = startIndex; i <= endIndex; i++)
  77.         {
  78.             System.out.print(arr[i] + " ");
  79.         }
  80.     }
  81.  
  82. }
  83.  
  84.  
  85. //java/6694

回复 "Java求数组的子数组之和的最大值"

这儿你可以回复上面这条便签

captcha