微软等面试100题筛选答案-3-求子数组最大和

12 篇文章 0 订阅
6 篇文章 0 订阅

以前做过类似的http://blog.csdn.net/byluo/article/details/15498813


//输入一个整形数组,数组里有正数也有负数。
//数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
//求所有子数组的和的最大值。要求时间复杂度为O(n)。
//最大子段和

#include "stdafx.h"
#include<iostream>
using namespace std;
#define iMAXSIZE  (sizeof(iSrcArr)/sizeof(iSrcArr[0]))+100
//最大子段和
//

void getBiggestSum(int iSrcArr[],int iSize){//原数组,数组长度
	int iSumArr[iMAXSIZE];
	iSumArr[0] = iSrcArr[0];
	int i,j;
	for (int i = 1; i<iSize; i++){
		if (iSumArr[i-1] + iSrcArr[i] > 0){//每次累加上一次的和只要大于0,就可以算入下一次的数值中
			iSumArr[i] = iSumArr[i-1] + iSrcArr[i];
		}else{
			iSumArr[i] = 0;
		}
	}
	int iStart = 0,iEnd = 0,iMaxSum = iSumArr[0];//起点,终点,和

	for (int j = 1;j<iSize; j++){
		if (iSumArr[j] > iMaxSum){//只要找出最大值,那么这个值就是所求的值
			iMaxSum = iSumArr[j];
			iEnd = j;
		}
	}
	j = iEnd;
	while (iSumArr[j]>0 && j>=0)j--;//找起点
	iStart = j+1;
	cout<<"start:"<<iStart+1<<" end:"<<iEnd+1<<" Sum:"<<iMaxSum<<endl;
	return;
}
int _tmain(int argc, _TCHAR* argv[]){
	int iSrcArr[] = {9,-8,1,-10,88,4,-5,7,9,-100};
	getBiggestSum(iSrcArr,sizeof(iSrcArr)/sizeof(iSrcArr[0]));
	return 0;
}


简洁篇

#include "stdafx.h"
#include <iostream>
using namespace std;

int maxSum(int* a, int n){
	int sum=0;
	int b=0;
	for(int i=0; i<n; i++){
		if(b<0)
			b=a[i];
		else
			b+=a[i];
		if(sum<b)
		sum=b;
	}
	return sum;
}

int main(){
    int a[10]={1,-8,6,3,-1,5,7,-2,0,1};
    cout<<maxSum(a,10)<<endl;
    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值