寻找最大子串

题目:从一个数组中寻找一个连续子数组,使其中元素之和最大,给出该和值。

例如:数组[-2, 1, -3, 4, -1, 2, 1, -5, 4]和最大的子串是[4, -1, 2, 1],其和为6。

分析

将数组从中间切分,中间元素属于左边,则最大子串为下面三种情况之一:

  1. 子串仅包含左边元素;

  2. 子串仅包含右边元素;

  3. 子串同时包含左边和右边的元素;


代码

// JavaScript solution
function findMaxSubArray(a, begin, end) {
  if(begin >= end) return a[begin];    // 边界判断
  
  var middle = Math.floor((begin + end) / 2);
  var leftRtn = findMaxSubArray(a, begin, middle);    // 递归查找左边最大值
  var rightRtn = findMaxSubArray(a, middle+1, end);    // 递归查找右边最大值
  
  // 查找同时包含左右元素的最大值
  var leftMax = a[middle];
  var rightMax = a[middle+1];
  
  var tempSum = 0;
  for(var i = middle; i >= begin; --i) {
    tempSum += a[i];
    if(tempSum > leftMax) leftMax = tempSum;
  }
  
  tempSum = 0;
  for(var i = middle + 1; i <= end; ++i) {
    tempSum += a[i];
    if(tempSum > rightMax) rightMax = tempSum;
  }
  
  return Math.max(leftMax + rightMax, leftRtn, rightRtn);
}

// Test case
var testArray = [-2, 1, -3, 4, -1, 2, 1, -5, 4];
console.log(findMaxSubArray(testArray, 0, testArray.length - 1));

// Output ==> 6


转载于:https://my.oschina.net/u/1454562/blog/295982

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值