子数组的最大和

package com.shiyeqiang.test1;
/**
 * 题目3:(求数组中子序列和的最大值!!)
 * 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
 * 求所有子数组的和的最大值。
 * 要求时间复杂度为O(n)。 例如:输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7,  2,因此输出为该子数组的和18。 
 *
 * @author Shiyeqiang
 *
 */
public class Test3 {
 public static void main(String[] args) {
  int[] arr = new int[] { 1, -2, 3, 10, -4, 7, 2, -5 };
  System.out.println(fun(arr));
 }
 /**
  * 采取动态规划的思想求最大递增子序列的和 算法思想:①:首先判断数组是否有意义;
  * ②:定义一个游标,将该游标与当前的最大值进行比较;
  * 如果:游标大,则将最大值更新为游标的取值; 如果游标的值为为负数,则将游标的值为0;;
  * ③:遍历完成以后,如果结果为为0,则说明最终结果应该是取得数组中的最大值!
  *
  *
  */
 public static int fun(int[] arr) {
  // 1:首先判断数组是否有意义
  if (arr.length == 0 || arr == null) {
   return 0;
  }
         //1, -2, 3, 10, -4, 7, 2, -5
 
  int result = 0; //0
  int temp = result;     //0
  for (int i = 0; i < arr.length; i++) {
   temp += arr[i];           //1,-1,3,13,9,16,18,13
   if (temp < 0) {
    temp = 0;     //0,则前面的将丢弃,因为是求得最大值的和的形式啊
   }
   if (temp > result) {
    result = temp;      //1,3,13,16,18
   }
  }
  if (result == 0) { 
    //则这个时候将是取得字符串的最大值
   result = arr[0];
   for (int i = 0; i < arr.length; i++) {
    if (result < arr[i]) {
     result = arr[i];
    }
   }
  }
  return result;
 }
 
 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值