【剑指offer之最大子向量和(连续子数组的最大和)】
来源:互联网 发布:uiautomator java 编辑:程序博客网 时间:2024/05/16 01:01
【题目链接】:click here~~
【题目描述】:
我们得到如下递归公式:
公式的意义:当以第i-1个数字结尾的子数组中所有数字的和小于0时,如果把这个负数与第i个数相加,得到的结果比原先还小,所以这种情况以第i个数字结尾的子数组就是第i个数本身。如果以第i-1个数字结尾的子数组中所有数字的和大于0,与第i个数累加就得到以第i个数结尾的子数组中所有数字和。
对于记录开始与结束位置下标,我们知道,每当当前子数组和的小于0时,便是新一轮子数组的开始,每当更新最大和时,便对应可能的结束下标,这个时候,只要顺便用本轮的起始和结束位置更新始末位置就可以,程序结束,最大子数组和以及其始末位置便一起被记录下来了。
【代码】:
#pragma comment(linker,"/STACK:102400000,102400000")#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <set>#include <stack>#include <math.h>#include <map>#include <queue>#include <deque>#include <vector>#include <algorithm>using namespace std;typedef long long LL;const int maxn = 1e5+10;const LL MOD = 999999997;const int inf= 0x3f3f3f3f;int dir4[4][2]= {{1,0},{0,1},{-1,0},{0,-1}};int dir8[8][2]= {{1,0},{1,1},{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1}};/*Super waigua */inline int read(){ int c=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();} return c*f;}int a[maxn];int max_sum_of_arr(int *a,int n){ int cur_begin=0,begin=0,end=0; int sum=-inf; int cur_sum=0; for(int i=0; i<n; ++i) { if(cur_sum<0) {cur_sum=a[i];cur_begin=i; } else cur_sum+=a[i]; if(cur_sum>sum){sum=cur_sum;begin=cur_begin;end=i;} } printf("%d %d %d\n",sum,begin,end);}int main(){ // freopen("in.txt","r",stdin); int n,m; while(~scanf("%d",&n)&&n) { for(int i=0; i<n; ++i) a[i]=read(); max_sum_of_arr(a,n); } return 0;}/************************************************************** Problem: 1372 User: herongwei Language: C++ Result: Accepted Time:190 ms Memory:1908 kb****************************************************************/
1 0
- 【剑指offer之最大子向量和(连续子数组的最大和)】
- 剑指offer系列源码-最大子向量和(连续子数组的最大和)
- 【剑指Offer面试题】 九度OJ1372:最大子向量和(连续子数组的最大和)
- [九度OnlineJudge][剑指Offer]题目1372:最大子向量和(连续子数组的最大和)
- 剑指Offer之连续子数组的最大和
- 剑指Offer之 - 连续子数组的最大和
- 剑指offer之连续子数组的最大和
- 【剑指offer】之连续子数组的最大和
- 剑指offer(三十九)之连续子数组的最大和
- 剑指offer之连续子数组的最大和
- 剑指offer(32):连续子数组的最大和
- 剑指offer(27)-连续子数组的最大和
- 连续子数组的最大和(剑指Offer)
- #剑指offer(17)--连续子数组的最大和
- [剑指offer]连续子数组最大和
- 剑指offer-最大连续子数组和
- 剑指offer:连续子数组最大和
- 剑指offer---连续子数组最大和
- github上如何删除一个项目(仓库)
- <大话设计模式>笔记
- JAVA程序的初始顺序
- 深入理解Java中的equals和==(出处:http://www.cnblogs.com/dolphin0520/)
- 复习1
- 【剑指offer之最大子向量和(连续子数组的最大和)】
- DelayedQueue
- ubuntu shell命令划重点
- Python内存
- Java中的UTF-8、UTF-16编码字符所占字节数
- 类的简介
- 阿里笔试和毕业论文
- Vue键盘事件
- 蓝桥杯 算法训练 乘积最大 dp