1. 程式人生 > >劍指Offer之連續子陣列的最大和

劍指Offer之連續子陣列的最大和

題目描述:

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
【解析】




【程式碼】

/*********************************
*   日期:2013-11-21
*   作者:SJF0115
*   題號: 題目1372:連續子陣列的最大和
*   來源:http://ac.jobdu.com/problem.php?pid=1372
*   結果:AC
*   來源:劍指Offer
*   總結:
**********************************/
#include<iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
using namespace std;

int Num[100001];
//連續子陣列的最大和
int MaxOfSubArray(int n,int &indexStart,int &indexEnd){
    int i,currentMax = 0,num,Max = 0,currentStart = 0;
    for(i = 0;i < n;i++){
        scanf("%d",&num);
        //初始化
        if(i == 0){
            currentMax = num;
            Max = num;
            indexStart = 0;
            indexEnd = 0;
        }
        else{
            //如果當前得到的和是個負數,那麼這個和在接下來的累加中應該拋棄並重新清零,
            //不然的話這個負數將會減少接下來的和
            if(currentMax < 0){
                currentMax = 0;
                currentStart = i;
            }
            currentMax += num;
            //更新最大值
            if(currentMax > Max){
                Max = currentMax;
                indexStart = currentStart;
                indexEnd = i;
            }
        }
    }
    return Max;
}

int main() {
    int n,Max,indexStart,indexEnd;
    while(scanf("%d",&n) != EOF && n != 0){
        Max = MaxOfSubArray(n,indexStart,indexEnd);
        printf("%d %d %d\n",Max,indexStart,indexEnd);
    }//while
    return 0;
}

【解法二】

動態規劃

【解析】


【程式碼】

/*********************************
*   日期:2013-11-21
*   作者:SJF0115
*   題號: 題目1372:連續子陣列的最大和
*   來源:http://ac.jobdu.com/problem.php?pid=1372
*   結果:AC
*   來源:劍指Offer
*   總結:
**********************************/
#include<iostream>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
using namespace std;

//連續子陣列的最大和
int MaxOfSubArray(int *array,int n,int &indexStart,int &indexEnd){
    int i,Max,currentStart;
    //初始化
    int *current = (int*)malloc(sizeof(int)*n);
    current[0] = array[0];
    Max = array[0];
    indexStart = 0;
    indexEnd = 0;
    currentStart = 0;
    //求最大和
    for(i = 1;i < n;i++){
        if(current[i-1] < 0){
            current[i] = array[i];
            currentStart = i;
        }
        else{
            current[i] = array[i] + current[i-1];
        }
        if(current[i] > Max){
            Max = current[i];
            indexStart = currentStart;
            indexEnd = i;
        }
    }
    return Max;
}

int main() {
    int i,n,Max,indexStart,indexEnd;
    while(scanf("%d",&n) != EOF && n != 0){
        int *array = (int*)malloc(sizeof(int)*n);
        for(i = 0;i < n;i++){
            scanf("%d",&array[i]);
        }
        Max = MaxOfSubArray(array,n,indexStart,indexEnd);
        printf("%d %d %d\n",Max,indexStart,indexEnd);
    }//while
    return 0;
}


相關推薦

offer連續陣列

題目:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2},連續子向量的最大和為8(從第0個開始,到第3個為止)。給一個數組,返回它的最大連續子序

Offer連續陣列

題目描述: HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天JOBDU測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它

offer連續陣列(Python)

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果

offer:(31)時間效率 :連續陣列

package jianzhioffer; public class Solution31 { //動態規劃:就是將中間值儲存下來 public static int FindGreatestSumOfSubArray(int[] array) { if (array == null

Offer 30. 連續陣列陣列

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15,1,2,2}

【Java】 offer(44) 連續陣列Offer》Java實現合集 《Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目    數字以0123456789101112131415…的格式序列化到一個字元序列中。在這個序列中,第5位(從0開始計數)是5,第13位是1,第19位是4,等等。請寫一個

offer連續陣列

時間限制:1秒 空間限制:32768K 熱度指數:176092 本題知識點: 陣列 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量

Offer-42 連續陣列

題目: 輸入一個 非空 整型陣列,數組裡的數可能為正,也可能為負。陣列中一個或連續的多個整陣列成一個子陣列。求所有子陣列的和的最大值。要求時間複雜度為O(n)。 樣例 輸入:[1, -2, 3, 10, -4, 7, 2, -5] 輸出:18 解答: class Solution

[offer] 30. 連續陣列

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7,-15

牛客網 《Offer》程式設計 30.連續陣列

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,

Offer-30.連續陣列(Javascript)

30.連續子陣列的最大和 題目連結 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數

offer連續陣列

時間限制:1秒 空間限制:32768K 熱度指數:54591 本題知識點: 陣列 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模

連續陣列O(n)兩種解法:雙指標 動態規劃

題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:{6,-3,-2,7

動態規劃--求目標值問題、找零錢問題以及求連續陣列 --java

1、動態規劃一般可分為線性動規,區域動規,樹形動規,揹包動規四類。 舉例: 線性動規:攔截導彈,合唱隊形,挖地雷,建學校,劍客決鬥等; 區域動規:石子合併, 加分二叉樹,統計單詞個數,炮兵佈陣等; 樹形動規:貪吃的九頭龍,二分查詢樹,聚會的歡樂,數字三角形等;

常見演算法 - 連續陣列

public class Solution { public int FindGreatestSumOfSubArray(int[] array) { if(array.length == 0){ return 0; }

陣列連續陣列乘積

題目:給定一個數組,要求其連續子陣列的最大和。如陣列為{6,-3,-2,7,-15,1,2,2},連續子陣列的最大和為8(從第0個開始,到第3個為止) 解法1:首先最容易想到的便是利用列舉的方法,枚舉出所有可能大小的連續子陣列的和,然後選出其中最大的一個。即從連續子陣列的大

求某個數組裡連續陣列的幾個演算法

注意:這裡的陣列元素,有可能全為負。這樣,所謂的: int find_max_array(const vector<int> &a) { int max_sum = 0; int this_sum = 0; fo

動態規劃演算法(連續陣列,O(N)時間複雜度O(1)空間複雜度) 【更新於:2018-05-13】

這個題目最早在13年阿里筆試出現,直到前兩天面試另一家電商又出現,哎,欠的都是要還的。 這個問題的思路如下:一維陣列的下標連續的元素構成連續子陣列,求所有連續子陣列中和最大的那個子陣列。 解析:2018-11-08 1 首先這個問題要轉化為Q(n)的問題,對於Q(n)的

連續陣列

題目描述: 輸入一個整形陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10,

連續陣列問題

1. 問題描述 輸入一個整形陣列,求陣列中連續的子陣列使其和最大。比如,陣列x 應該返回 x[2..6]的和187. 2. 問題解決 我們很自然地能想到窮舉的辦法,窮舉所有的子陣列的之和,找出最大值。 窮舉法 i, j的for迴圈表示x[i..j],k的for