0
点赞
收藏
分享

微信扫一扫

微软100题第三题(求子数组的最大和)


1python版

 

'''
Created on 2017-1-16

@author: admin
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
'''
import sys

def maxSubArray(data,start,end):
middle=(start+end)//2
if start==end:
return data[start]
if start<=middle-1:
leftMax=maxSubArray(data, start, middle-1)
else:
leftMax=-sys.maxsize-1
if middle+1<=end:
rightMax=maxSubArray(data, middle+1, end)
else:
rightMax=-sys.maxsize-1
middleMax=computeMiddleMax(data,start,end)
return max([leftMax,rightMax,middleMax]);
def computeMiddleMax(data,start,end):
middle=(start+end)//2
leftmax=0
lefttmp=0
for i in reversed(range(start,middle)):
lefttmp+=data[i]
if(lefttmp>leftmax):
leftmax=lefttmp
rightmax=0
righttmp=0;
for i in range(middle+1,end+1):
righttmp+=data[i]
if righttmp>rightmax:
rightmax=righttmp
return data[middle]+leftmax+rightmax
if __name__ == '__main__':
data=[3,-4,6,3,2,-5,1,8,-3,7,9]
print(maxSubArray(data,0,len(data)-1))

 

 

 

2java版

scala版


package ms

import java.awt.font.NumericShaper.Range
/**
* 3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
*/
object MicroSoft003 {
def maxSubArray(data:List[Int],start:Int,end:Int):Int={
val middle=(start+end)/2
if(start==end){
return data(start)
}
var leftMax=Int.MinValue;
if(start<=middle){
leftMax=maxSubArray(data, start, middle-1)
}
var rightMax=Int.MinValue
if(middle+1<=end){
rightMax=maxSubArray(data, middle+1, end)
}
val middleMax=computeMiddleMax(data,start,end)
return math.max(leftMax, math.max(rightMax, middleMax))

}

def computeMiddleMax(data:List[Int],start:Int,end:Int):Int={
val middle=(start+end)/2
var leftMax=0;
var leftTmp=0;
for(i<-(start until middle).reverse){
leftTmp+=data(i)
if(leftTmp>leftMax){
leftMax=leftTmp;
}
}
var rightMax=0;
var rightTmp=0;
for(i<-(middle+1 to end)){
rightTmp+=data(i)
if(rightTmp>rightMax){
rightMax=rightTmp;
}
}
return leftMax+data(middle)+rightMax;
}

def main(args: Array[String]): Unit = {
val data=List(1, -2, 3, 10, -4, 7, 2, -5)
println(maxSubArray(data,0,data.length-1));
}
}



 



c语言版本


/*
* microsoft003.c
*
* Created on: 2017年1月26日
* Author: admin
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
*/

#include <stdio.h>
#include <limits.h>

int crossSum(int data[],int left,int right);
int subArraySum(int data[],int left,int right);
int getMax(int a,int b,int c);

int main3(){
int data[]={1, -2, 3, 10, -4, 7, 2, -5};
printf("%d\n",subArraySum(data,0,sizeof(data)/sizeof(int)-1));
return 0;
}

int crossSum(int data[],int left,int right){
int middle=(left+right)/2;
int sum=data[middle];
int leftSum=0;
int tmp=0;
for(int i=middle-1;i>=left;i--){
tmp+=data[i];
if(leftSum<tmp){
leftSum=tmp;
}
}
tmp=0;
int rightSum=0;
for(int i=middle+1;i<=right;i++){
tmp+=data[i];
if(rightSum<tmp){
rightSum=tmp;
}
}
sum=sum+leftSum+rightSum;
return sum;
}

int subArraySum(int data[],int left,int right){
int middle=(left+right)/2;
int leftSum=INT_MIN;
if(left<=middle-1){
leftSum=subArraySum(data,left,middle-1);
}
int corSum=crossSum(data,left,right);
int rightSum=INT_MIN;
if(right>=middle+1){
rightSum=subArraySum(data,middle+1,right);
}
return getMax(leftSum,corSum,rightSum);
}

int getMax(int a,int b,int c){
if(a>=b){
if(a>=c){
return a;
}else{
return c;
}
}else{
if(b>=c){
return b;
}else{
return c;
}
}
}

c++版本


/*
* microsoft003.cpp
*
* Created on: 2017年2月6日
* Author: admin
3.求子数组的最大和(数组)
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。
例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。
*/
#define MAX_LEN 100
#include "iostream"
#include "limits.h"
using namespace std;

class MaxSubArray{
public:
MaxSubArray(int data[],int len){
this->len=len;
for(int i=0;i<len;i++){
this->data[i]=data[i];
}
}
public:
int compute(){
return compute(0,len-1);
}
int compute(int left,int right){
int middle=(left+right)/2;
int leftMax=INT_MIN;
if(left<=middle-1){
leftMax=compute(left,middle-1);
}
int rightMax=INT_MIN;
if(middle+1<=right){
rightMax=compute(middle+1,right);
}
int crossMax1=crossMax(left,right);
return max(leftMax,max(rightMax,crossMax1));
}
private:
int max(int a,int b){
if(a>b){
return a;
}else{
return b;
}
}
int crossMax(int left,int right){
int middle=(left+right)/2;
int m=data[middle];
int leftSum=0;
int leftTmp=0;
for(int i=middle-1;i>=left;i--){
leftTmp+=data[i];
if(leftTmp>leftSum){
leftSum=leftTmp;
}
}
int rightSum=0;
int rightTmp=0;
for(int i=middle+1;i<=right;i++){
rightTmp+=data[i];
if(rightTmp>rightSum){
rightSum=rightTmp;
}
}
return m+leftSum+rightSum;
}
private:
int len;
int data[MAX_LEN];
};

int main(){
int data[]={1, -2, 3, 10, -4, 7, 2, -5};
MaxSubArray msa(data,8);
cout<<msa.compute()<<endl;
return 0;
}




 

举报

相关推荐

0 条评论