Java求数组中连续n个元素使其和最大

给定一个数组,求出数组中连续的一些元素使其和的值最大。如果所有元素都为正数,显然整个数组即为所求的。如果所有元素的值为负数,则所求的最大值为0.

这是在编程珠玑上看到的,其时间复杂度由O(n3)减为O(n)了。

java代码

package cn.lifx.test;

public class MaxSum
{
  public static void main(String[] args)
  {
  int[] arr = new int[]{31, -41, 59, 26, -53, 58, 97, -93, -23, 84};

  MaxSum ms = new MaxSum();

  ms.Max(arr);
  ms.Max2(arr);
  ms.Max3(arr);

  int max = ms.Max4(arr, 0, arr.length-1);
  System.out.println("Max sum is " + max);

  ms.Max5(arr);
  }

  //方法1: 时间复杂度为O(n*n*n)
  public void Max(int[] arr)
  {
  int max = 0;
  int sum = 0;
  int left = -1;
  int right = -1;

  for(int i=0; i<arr.length; i++)
  {
   for(int j=i; j<arr.length; j++)
   {
   sum = 0;

   for(int k=i; k<=j; k++)
   {
    sum = sum + arr[k];
   }

   if(sum > max)
   {
    left = i;
    right = j;
    max = sum;
   }
   }
  }

  if(right > 0)
  {
   System.out.println("Max is from element " + left + "(" + arr[left] + ") to element " + right + "(" + arr[right] + "), max sum is " + max);
  }
  else
  {
   System.out.println("Max sum is 0 .");
  }
  }

  //方法2:时间复杂度为O(n*n)
  public void Max2(int[] arr)
  {
  int max = 0;
  int sum = 0;
  int left = -1;
  int right = -1;

  for(int i=0; i<arr.length; i++)
  {
   sum = 0;
   for(int j=i; j<arr.length; j++)
   {
   sum = sum + arr[j];
   if(sum > max)
   {
    left = i;
    right = j;
    max = sum;
   }
   }
  }

  if(right > 0)
  {
   System.out.println("Max is from element " + left + "(" + arr[left] + ") to element " + right + "(" + arr[right] + "), max sum is " + max);
  }
  else
  {
   System.out.println("Max sum is 0 .");
  }
  }

  //方法3:时间复杂度为O(n*n)
  public void Max3(int[] arr)
  {
  int max = 0;
  int sum = 0;
  int left = -1;
  int right = -1;

  int[] temp = new int[arr.length+1];

  temp[0] = 0;
  for(int i=0; i<arr.length; i++)
  {
   temp[i+1] = temp[i] + arr[i];
  }

  for(int i=0; i<arr.length; i++)
  {
   for(int j=i; j<temp.length; j++)
   {
   sum = temp[j] - temp[i];
   if(sum > max)
   {
    left = i;
    right = j-1;
    max = sum;
   }
   }
  }

  if(right > 0)
  {
   System.out.println("Max is from element " + left + "(" + arr[left] + ") to element " + right + "(" + arr[right] + "), max sum is " + max);
  }
  else
  {
   System.out.println("Max sum is 0 .");
  }
  }

  //方法4:时间复杂度为O(n*logn)
  public int Max4(int[] arr, int left, int right)
  {
  int sum = 0;
  int max = 0;
  int max1 = 0;
  int max2 = 0;
  int middle = 0;

  if(left > right)
  {
   return 0;
  }
  else if(left == right)
  {
   return (arr[left] > 0 ? arr[left] : 0);
  }

  middle = (left + right)/2;

  for(int i=middle; i>=left; i--)
  {
   sum = sum + arr[i];
   if(sum > max1)
   {
   max1 = sum;
   }
  }

  sum=0;
  for(int i=middle+1; i<=right; i++)
  {
   sum = sum + arr[i];
   if(sum > max2)
   {
   max2 = sum;
   }
  }

  max = max1+max2;
  int temp1 = Max4(arr, left, middle);
  int temp2 = Max4(arr, middle+1, right);

  if(temp1 > max)
  {
   max = temp1;
  }

  if(temp2 > max)
  {
   max = temp2;
  }

  return max;
  }

  //方法5:时间复杂度为O(n)
  public void Max5(int[] arr)
  {
  int max1 = 0;
  int max2 = 0;
  int left = -1;
  int right = -1;
  int temp = 0;

  for(int i=0; i<arr.length; i++)
  {
   temp = (max1+arr[i]);
   if(temp > 0)
   {
   max1 = temp;
   }
   else
   {
   left = i+1;
   max1 = 0;
   }

   if(max1 > max2)
   {
   right = i;
   max2 = max1;
   }
  }

  if(right > 0)
  {
   System.out.println("Max is from element " + left + "(" + arr[left] + ") to element " + right + "(" + arr[right] + "), max sum is " + max2);
  }
  else
  {
   System.out.println("Max sum is 0 .");
  }
  }
}

输出为:

Java代码

Max is from element 2(59) to element 6(97), max sum is 187
Max is from element 2(59) to element 6(97), max sum is 187
Max is from element 2(59) to element 6(97), max sum is 187
Max sum is 187
Max is from element 2(59) to element 6(97), max sum is 187

时间: 2024-08-22 14:07:12

Java求数组中连续n个元素使其和最大的相关文章

Java得到数组中最有效的元素和下标

先看代码 import java.util.Arrays; /** * 得到数组中最有效的元素和下标.<br> * 最有效的只出现频率超过长度一半的数据. * * @author 赵学庆 www.java2000.net */ public class MyTest { public static void main(String[] args) { int[] values = new int[] { 5, 3, 5, -5, 5, 0, 5 }; int maxValue = getMax

php求正负数数组中连续元素最大值示例

 问题是给出数组,该数组由正负数字组成,找出该数组中连续元素组成的子数组的最大值.下面是PHP实现的示例,需要的朋友可以参考下 php实现正负数数组最大子序列,要求给出数组,该数组由正负数字组成,找出该数组中连续元素组成的子数组的最大值. 这其实得算是个背包变种吧.   代码如下: <?php $list = array(1,-3,-5,-7,8,9,-11,5);   $cur = 0; $term = 0; $res = 0; $begin = 0;   foreach($list as $

php求正负数数组中连续元素最大值示例_php实例

php实现正负数数组最大子序列,要求给出数组,该数组由正负数字组成,找出该数组中连续元素组成的子数组的最大值.这其实得算是个背包变种吧. 复制代码 代码如下: <?php$list = array(1,-3,-5,-7,8,9,-11,5); $cur = 0;$term = 0;$res = 0;$begin = 0; foreach($list as $k => $v){ $cur += $v; if($cur < 0){  $cur = 0;  $begin = $k + 1; }

任意元素和-求一个数组中选出任意个数元素相加之和,求大神指教

问题描述 求一个数组中选出任意个数元素相加之和,求大神指教 求一个数组中选出任意个数元素相加之和,求大神指教 比如打印出arry[8]中,任意两个数相加的和,任意三个数相加的和,直到任意八个数相加的和. 求大神指教. 解决方案 不知道你用的什么语言 如果C#,参考我写的http://bbs.csdn.net/topics/390550326 这个问题其实就是求M选N,其中M=8,N循环1-8 然后得到每个组合再求和. 解决方案二: 不知道你使用的是什么语言,不过思路是这样的,你的要求是不是随机数

百度面试题:求一个已排序的数组中绝对值最小的元素

题目为: 有一个已经排序的数组(升序),数组中可能有正数.负数或0,求数组中元素的绝对值最小的数,要求,不能用顺序比较的方法(复杂度需要小于O(n)),可以使用任何语言实现 例如,数组{-20,-13,-4, 6, 77,200} ,绝对值最小的是-4. 这一题该如何求呢? 初步的解决思路是:     1.数组中的元素全为正,取最左边的数字:     2.数组中的元素全为负,取最右边的数字的绝对值:     3.数组中有正数有负数,就用二分法查找,判断中间元素的符号        a)中间元素为

java求数组元素重复次数和java字符串比较大小示例_java

复制代码 代码如下: /** * Name: 求数组中元素重复次数对多的数和重复次数 * Description:  * 数组中的元素可能会重复,这个方法可以找出重复次数最多的数,同时可以返回重复了多少次. * 但需要知道这个数组中最大的元素是多少,如果无法确定,就悲剧啦~ * * @param array目标数组: *           max数组中数据的最大值: * @return 返回一个包含重复次数最多的数(value)和重复次数(maxCount)的map集合: *         

利用Collections工具类获取字符串数组中最长的元素

package cn.com; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.List; //要求:获取字符串数组中最长的元素 //在这里要利用Collections的另一个max方法 //public static <T> T max(Collection<? extends T> coll, Comparator<?

PHP获取数组中重复最多的元素的实现方法

 本文实例讲述了PHP获取数组中重复最多的元素的实现方法.分享给大家供大家参考.具体方法如下: 代码如下: <?php /** * * Created on 2014-4-1 * @param array $array * @param int [optional] $length * @return array */ function mostRepeatedValues($array,$length=0){ if(emptyempty($array) or !is_array($array)

JavaScript从数组中删除指定值元素的方法

 这篇文章主要介绍了JavaScript从数组中删除指定值元素的方法,实例分析了两种常用的javascript操作数组指定元素的技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了JavaScript从数组中删除指定值元素的方法.分享给大家供大家参考.具体分析如下: 下面的代码使用了两种方式删除数组的元素,第一种定义一个单独的函数,第二种为Array对象定义了一个removeByValue的方法,调用非常简单 定义函数removeByValue进行元素删除 ? 1 2 3 4