求子陣列的最大和問題
題目:
輸入一個整形陣列,陣列裡有正數也有負數。
陣列中連續的一個活多個整陣列成一個子陣列,每個子陣列都有一個和。
求所有子陣列的和的最大值。要求時間複雜度是O(n).
這道題目如果沒有時間複雜度的限制的話,那一分鐘便可以寫出來。因為三層for迴圈,使用窮舉法,便可以直接求的最大值。這樣的話時間複雜度就是N^3,但是如果是O(N)的話,那麼就必須要求只有一次for迴圈。那麼應該組織程式碼才能求出這個最大子陣列和呢?
其實思想很簡單,那就是從頭開始遍歷陣列,如果不斷累加陣列的各個元素。如果出現和小於0的情況,那麼能說明一個問題:最大子陣列一定不包括已經求得和的子陣列。那麼應該從當前位置重新求子陣列。如果出現和比舊的記錄大的情況,就更新最大值。
程式如下所示:
#include<iostream>
using namespace std;
int a[] = {4,-9,5,6,-2,-3,8,9,9,-7,-9,8};
struct Result{
int start;
int length;
int result;
};
Result maxSum(int* a,int n){
Result result;
int b = 0;
result.start = 0;
result.length = 0;
result.result = 0;
for(int i=0;i<n;i++){
if(b<0){
b = a[i];
result.start = i;
result.length = 1;
}
else{
b += a[i];
result.length ++;
}
if(result.result < b){
result.result = b;
}
}
return result;
}
int main(){
Result result = maxSum(a,sizeof(a)/sizeof(int));//注意這裡求陣列長度的方法
cout<<result.length<<endl;
cout<<"The max-sum sub array is as follows:"<<endl;
for (int n=result.start; n<result.start+result.length; n++)
{
cout<<a[n]<<" ";
}
cout<<endl<<"The max sum is :"<<endl;
cout<<result.result<<endl;
}
相關文章
- 牛客題霸--連續子陣列的最大和陣列
- 連續子陣列的最大和陣列
- [每日一題] 第十五題:連續子陣列的最大和每日一題陣列
- 劍指offer-例題 連續子陣列的最大和陣列
- JZ-030-連續子陣列的最大和陣列
- Google 面試題 | 3個非重複子陣列最大和Go面試題陣列
- php陣列問題PHP陣列
- 每日一練(22):連續子陣列的最大和陣列
- leetcode題解(陣列問題)LeetCode陣列
- 劍指 Offer 42.連續子陣列的最大和陣列
- 劍指office--31. 連續子陣列的最大和陣列
- 劍指Offer-連續子陣列中的最大和陣列
- JS中的陣列複製問題JS陣列
- 陣列和列表的轉換問題陣列
- 《劍指Offer》- 連續子陣列的最大和或最小和陣列
- 如何從整數陣列中找到最大和最小數陣列
- js陣列全排列問題JS陣列
- Python陣列中求和問題Python陣列
- 程式設計求一維陣列中最大和最小的元素值程式設計陣列
- 子陣列的最大異或和問題陣列
- 陣列的最小不可組成和問題陣列
- 子陣列異或和問題陣列
- 陣列效能問題分析總結陣列
- 陣列累加和問題三連陣列
- vue 陣列和物件渲染問題Vue陣列物件
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列
- 雙指標查詢陣列的連續規律子陣列問題指標陣列
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- Leetcode 陣列中和為給定值的最長子陣列LeetCode陣列
- 關於二維陣列指標的問題陣列指標
- 陣列(引用型別)複製問題陣列型別
- C++陣列預設初值問題C++陣列
- 最大子陣列問題(Maximum subarray problem)陣列
- JS陣列遍歷和獲取陣列最值JS陣列
- 陣列轉json後的資料型別問題陣列JSON資料型別
- leetcode 845. 陣列中的最長山脈 做題筆記LeetCode陣列筆記
- 978 最長湍流子陣列陣列
- 構建最簡單陣列陣列
- 陣列 題目陣列