【劍指offer】連續子陣列的最大和
轉載請註明出處:http://blog.csdn.net/ns_code/article/details/27103959
- 題目描述:
HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天JOBDU測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。你會不會被他忽悠住?
- 輸入:
輸入有多組資料,每組測試資料包括兩行。
第一行為一個整數n(0<=n<=100000),當n=0時,輸入結束。接下去的一行包含n個整數(我們保證所有整數屬於[-1000,1000])。
- 輸出:
對應每個測試案例,需要輸出3個整數單獨一行,分別表示連續子向量的最大和、該子向量的第一個元素的下標和最後一個元素的下標。若是存在多個子向量,則輸出起始元素下標最小的那個。
- 樣例輸入:
3 -1 -3 -2 5 -8 3 2 0 5 8 6 -3 -2 7 -15 1 2 2 0
- 樣例輸出:
-1 0 0 10 1 4 8 0 3
AC程式碼如下:
#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
bool flag;
int MaxSubSum(int *arr,int len,int *indexBegin,int *indexEnd)
{
if(arr==NULL || len<1)
{
flag = false;
return -1;
}
int i;
int MaxSum;
int CurSum;
int CurBegin; //當前的CurSum的開始處的索引
int CurEnd; //當前的CurSum的結束處的索引
for(i=0;i<len;i++)
{
if(i == 0)
{
//先用第一個元素初始化
*indexBegin = 0;
*indexEnd = 0;
CurBegin = 0;
CurEnd = 0;
MaxSum = arr[i];
CurSum = arr[i];
}
else
{
//前面的和小於0,拋棄前面的和,從當前元素重新開始計算
if(CurSum < 0)
{
CurSum = arr[i];
CurBegin = i;
CurEnd = i;
}
else
{
CurSum += arr[i];
CurEnd = i;
}
if(CurSum > MaxSum)
{
MaxSum = CurSum;
//如果當前和大於前面出現的最大和,
//則替換掉最大和的開始索引和結束索引
*indexBegin = CurBegin;
*indexEnd = CurEnd;
}
}
}
return MaxSum;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF && n!=0)
{
int *arr = (int *)malloc(sizeof(int)*n);
if(arr == NULL)
exit(EXIT_FAILURE);
int i;
for(i=0;i<n;i++)
scanf("%d",arr+i);
flag = true;
int indexBegin,indexEnd;
int result = MaxSubSum(arr,n,&indexBegin,&indexEnd);
if(flag)
{
printf("%d ",result);
printf("%d ",indexBegin);
printf("%d\n",indexEnd);
}
free(arr);
arr = NULL;
}
return 0;
}
/**************************************************************
Problem: 1372
User: mmc_maodun
Language: C
Result: Accepted
Time:450 ms
Memory:1304 kb
****************************************************************/
相關文章
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指Offer-連續子陣列中的最大和陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 劍指offer-例題 連續子陣列的最大和陣列
- 劍指office--31. 連續子陣列的最大和陣列
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- 連續子陣列的最大和陣列
- Maximum Subarray 連續子陣列最大和陣列
- JZ-030-連續子陣列的最大和陣列
- 牛客題霸--連續子陣列的最大和陣列
- 每日一練(22):連續子陣列的最大和陣列
- 劍指 offer(1) -- 陣列篇陣列
- 【劍指offer】陣列中的逆序對陣列
- 【劍指offer】把陣列排成最小的數陣列
- 劍指offer之順序列印陣列陣列
- 【劍指offer】調整陣列順序陣列
- [每日一題] 第十五題:連續子陣列的最大和每日一題陣列
- 劍指offer:旋轉陣列的最小數字陣列
- 【劍指offer】二維陣列中的查詢陣列
- 劍指offer 旋轉陣列的最小數字陣列
- 【劍指offer】旋轉陣列的最小值陣列
- 劍指Offer-37-陣列中逆序對陣列
- 《劍指offer》:[52]構建乘積陣列陣列
- 【演算法拾遺】三種方法求連續子陣列的最大和演算法陣列
- 劍指Offer--陣列中重複的數字陣列
- 劍指Offer-34-把陣列排成最小的數陣列
- 劍指offer——把陣列排成最小的數C++陣列C++
- 劍指offer——陣列中的逆序對C++(75%)陣列C++
- 【劍指offer】【1】二維陣列中的查詢陣列
- 劍指offer-轉陣列的最小數字-php陣列PHP
- 《劍指offer》:[51]陣列中的重複數字陣列
- 【劍指offer】樹的子結構
- 【劍指offer】7.旋轉陣列的最小數字陣列
- 二維陣列中的查詢——牛客劍指offer陣列
- 劍指 Offer 11. 旋轉陣列的最小數字陣列
- 劍指 Offer 04. 二維陣列中的查詢陣列
- 【劍指 Offer】11. 旋轉陣列的最小數字陣列
- 《劍指offer》:[41]陣列中和為S的兩個數陣列