微软100题第三题(求子数组的最大和)
2017-01-16 14:38
381 查看
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版
http://blog.csdn.net/hxpjava1/article/details/22096809scala版
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; }
相关文章推荐
- 求子数组的最大和 【微软面试100题 第三题】
- 微软面试100题之第三题:求子数组的最大和
- 求子数组的最大和 【微软面试100题 第三题】
- 微软面试100题之三 求子数组的最大和
- 微软面试100道之3 求子数组的最大和(数组)
- 微软编程题之求子数组的最大和
- (微软面试100题)求子数组的最大和
- 微软100题第3题:求子数组的最大和
- 微软算法100题03 求子数组的最大和
- 微软等面试100题筛选答案-3-求子数组最大和
- 微软面试题---求子数组最大乘积问题
- 微软面试题解题笔记——求子数组的最大和
- 第三题(求子数组的最大和)
- 3 微软面试题:求子数组的最大和,并找出此子数组
- 微软面试100题系列---求子数组的最大和
- 【从零单排之微软面试100题系列】03之求子数组的最大和
- 微软100道算法题------求子数组的最大和
- 第三题(求子数组的最大和)
- 微软面试(3/100)--求子数组的最大和
- 微软等数据结构+算法面试100题(44)-- 求子数组的最大和