乙個有n個整數元素(可以是負數)的一維陣列,連續的子陣列有很多,那連續的子陣列之和的最大值是什麼呢?而這個和最大的子陣列是哪一段資料呢?下面就讓我們來一一的剖析這個問題。首先撇開後面乙個問題,不考慮究竟是哪一段資料,只需要求出最大的和就可以了。
1、在說思路之前,先看看網上比較流行的解法,到底這裡面有什麼問題呢?如果陣列裡面有正數,ok,那一點問題都沒有,比如說,其最大值依然是8,但是如果全是負數呢?比如說,正確答案應該是-1,但這裡卻只能得到0,。很明顯演算法有問題,或者說這種演算法的適用度不是很廣。
int errorgetmaxsubsum(int *array, int nlen)
else
if(sum < b)
}return sum;
}
2、下面我們來考慮一下幾種情況。陣列的第乙個元素arr[0],以及最大的一段陣列arr[i].....arr[j]跟arr[0]之間的關係,有以下幾種情況:
*當0=i=j時,元素arr[0]本身構成最大的一段;
*當0=iconst int inf = -1e5;
inline int max(const int a, const int b)
//得到陣列中的連續最大和
int getmaxsubsum(int *arr, int nlen)
return ans;
}//上面那個函式的更加精煉的版本
int getmaxsubsumex(int *arr, int nlen)
return ans;
}3、如果說在給出最大和的同時,需要知道是哪一段資料構成了這個最大和。那麼每一次sum被重置為0的時候,就可能是新的資料段的開始,用temp記下。每一次用sum來更新ans的時候,就說明當前這一段資料是最優的,當前這一段資料是[temp,i],所以更新[b,e]。
//在得到陣列最大和的同時,得到是哪一段資料
int getmaxsubsum(int *arr, int nlen, int &b, int &e)
sum += arr[i];
if(ans < sum)
}return ans;
}//列印陣列
void print(int *arr, int nlen)
int i;
for(i = 0; i < nlen; ++i)
printf("\n");
}
4、照例,最後給出main函式的呼叫方法。僅供參考,不需要者可以pass掉。
int main()
}
最後給出幾組測試用例的結果,當然其中有乙個是呼叫錯誤的方法得到的錯誤結果,一眼就可以看到啦!
程式設計之美系列之求子陣列的最大乘積
題目描述 給定乙個長度為n的整數陣列,只允許用乘法,計算任意 n 1 個數的組合中乘積最大的一組,並寫出演算法的時間複雜度。演算法分析 1 二逼青年的做法,把所有可能的 n 1 個數的組合照出來,分別計算它們的乘積,並比較大小。好吧 時間複雜度是o n 2 這種效率,我連 都懶得寫。面試100題系列...
程式設計之美2 14求子陣列之和的最大值
分而治之的思想 divide and conquer includeusing namespace std int max int a,int b int maxsum int a,int low,int high includeusing namespace std int max int a,i...
程式設計之美2 14 求子陣列之和的最大值
問題描述 乙個有n個整數元素的一維陣列 a 0 a n 1 這個陣列當然有很多子陣列,那麼子陣列之和的最大值是多少呢?思路一 最直接能想到的方法就是列舉,暴力解法,複雜度為o n 2 思路二 遞迴解法,將陣列分成長度相等的兩段陣列,分別為a 0 a n 2 1 和a n 2 a n 1 分別求出最大...