劍指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