問題:
求解數組中連續一段子數組和的最大值。例如:{31,-41,59,26,-53,58,97,-93,-23,84},最大值為59+26-53+58+97=187
思路:
計算出任意i到j之間連續子數組的和再比較必然能得到最大值,但時間復雜度為O(n^2),我們希望能找出線性時間的算法。
我們注意到,假如數組中全為正數,那么最大和必然為全部數相加;如果數組中有負數,並且如果加上某個負數,子數組的和小於0,則最大和子數組必然不包含這個負數。 基於此,給出以下代碼:
//計算數組中任何連續子數組的最大和 #include <stdio.h> int getMaxValue(int data[],int length) { int max = 0,temp = 0; int i =0; for(i=0;i<length;i++) { temp = temp + data[i]; if(temp < 0) temp = 0; else { if(temp > max) max = temp; } } return max; } int main() { int data[] = {31,-41,59,26,-53,58,97,-93,-23,84}; int length = sizeof(data) / sizeof(int); int max = getMaxValue(data,length); printf("%d",max); }
時間復雜度為o(n)