寻找最大子串

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

例如:数组[-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

寻找最大子串,布布扣,bubuko.com

时间: 2024-10-15 13:24:16

寻找最大子串的相关文章

C++实现在一个字符串中寻找最大子串

//#include "stdafx.h" #include<iostream> #include<vector> #include<string> #include<utility> using namespace std; pair<int ,string> fun(const string &s) { vector<string> substrs; string substr; int length=

求最大子串和 最长子串的java写法

同事去面试问到求最大和的子串,举例来说给你一个有正有负的数组, 1 -1 2 -4 5 6 -3,它的最大和就是 5 6 所组成的子串和11.根据其隔离性,即任何子串内部都不会有这样一个结构 2 -4,因为如果包含这个子串,必定不是最大子串(2-4<0),因此可以根据此性质,将数组进行分割,而分割的标志就是小于0的结构. 1 public static void main(String[] args) { 2 3 int[] array = {1,2,-4,3,5,-4,7,8,2,-1,6,-

PHP字符串操作大集合

字符串的处理非常重要.文本字符串中的空格或者其他没有意义的符号.例如,在一个电子商务应用中,当用户填写订单的内容时(如联系地址),可能输入一些空格.句号等PHP4及以上版本提供了4个去除字符串str首尾处空格或其他特殊符号.     string ltrim(string str [, string charlist]):去除字符串str尾的空格或其他特殊符号.     string chop(string str [, string charlist]):功能同rtrim(). 以上函数的第1

Java字符串实例

需求1:自己实现trim的方法. 需求2: 获取上传文件名  "D:\\20120512\\day12\\Demo1.java". 需求3: 将字符串对象中存储的字符反序.    新中国好     -----> 好国中新 需求4: 求一个子串在整串中出现的次数 . public class Demo6 { public static void main(String[] args) { String str  ="        传智        播客        

poj2752 Seek the Name, Seek the Fame(next数组的运用)

题目链接:http://poj.org/problem?id=2752 Seek the Name, Seek the Fame Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 12018   Accepted: 5906 Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and

C++概念

1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符.它们都可用于申请动态内存和释放内存.对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求.对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数.由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行

【转】C/C++ 笔试、面试题目大汇总

1.求下面函数的返回值( 微软) int func(x) { int countx =0; while(x) { countx ++; x = x&(x-1); } return countx; } 假定x = 9999. 答案:8 思路:将x转化为2进制,看含有的1的个数. 2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操作与对变量直接操作效果完全相同.申明一个引用的时候,切记要对其进行初始化.引用声明完毕后,相当于目标变量

c/c++笔试面试试题

C 试题(纯属转载) 1.求下面函数的返回值(微软) int func(x) {     int countx = 0;     while(x)     {           countx ++;           x = x&(x-1);      }     return countx; } 假定x = 9999. 答案:8 思路:将x转化为2进制,看含有的1的个数. 2. 什么是“引用”?申明和使用“引用”要注意哪些问题? 答:引用就是某个目标变量的“别名”(alias),对应用的操

Java String、StringBuffer和StringBuilder类

package com.fish.string; /*  String 字符串类:     题目:new String("abc")创建了几个对象?  两个对象,一个对象是 位于字符串常量池中,一个对象是位于堆内存中.    */ public class Demo1 {     public static void main(String[] args) {         String str1 = "hello";         String str2 =