經典演算法 求最大子串行的和

2021-09-17 21:19:49 字數 1735 閱讀 7670

最大連續子串行的和是一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列(不允許空序列),使它們的和盡可能大。

例:輸入序列 [2,3,-1,4]  , 輸出 9 

注意:可以假設 輸入的陣列不為空,同時輸入的值都是整數。

解法一:暴力破解 ,可以窮舉出所有的子串行,然後計算每個子串行的和,時間複雜度是o(n ^ 3),**如下:

private static int maxsum(int nums) 

if (sum > maxsum)

maxsum = sum;

}} return maxsum;

}

解法二:可用用乙個陣列記錄從開始到某個位置的和,例如sum[i] 表示從位置0到位置i的和,就可以省略到演算法一中的第三層迴圈,演算法的時間複雜度是 o(n ^ 2)

private static int maxsum1(int nums) 

int maxsum = nums[0];

for (int i = 0; i < nums.length; i++)

} return maxsum;

}

解法三 :分治法,見下圖,時間複雜度是o(n*logn) 

**如下:

private static int maxproduct(int nums, int left, int right) 

// 劃分為兩個規模更小的子問題

int mid = (left + right) >> 1;

int imaxleft = maxproduct(nums, left, mid);

int imaxright = maxproduct(nums, mid + 1, right);

// 橫跨分割點的情況

int sum = 0, lmax = nums[mid], rmax = nums[mid + 1];

for (int i = mid; i >= left; i--)

sum = 0;

for (int i = mid + 1; i <= right; i++)

// 答案是三種情況的最大值

int ans = lmax + rmax;

if (imaxleft > ans)

ans = imaxleft;

if (imaxright > ans)

ans = imaxright;

return ans;

}

解法四:動態規劃設定 dp[i] 表示以第i個數結尾的最大子串行的和,則 可以推導出以下公式

dp[n] = max(0, dp[n-1]) + nums[n]。則最大子串行的和是max(dp[m]) | m∈[0, n-1]

**如下:

private static int maxsum3(int nums) 

return maxsum;

}

求最大子串行和演算法

這是個比較經典的c語言演算法問題。記得,在大二參加c語言比賽的時候,碰到過這個問題。當時就在網上學習了這麼乙個經典演算法。但是到了現在已經有點兒遺忘,今天無意之中又看到了這道題,感覺很親切,而且感覺到這個演算法真的非常經典,所以還是決定收藏在部落格中,希望自己能牢記這個問題。這個演算法用到了動態規劃...

經典演算法 求最大子列和

題目 最大連續子數列和一道很經典的演算法問題,給定乙個數列,其中可能有正數也可能有負數,我們的任務是找出其中連續的乙個子數列 不允許空序列 使它們的和盡可能大。我們一起用多種方式,逐步優化解決這個問題。為了更清晰的理解問題,首先我們先看一組資料 8 2 6 1 5 4 7 2 3 輸出 14 題解 ...

求最大子串行和

include using namespace std int maxseqsum const int a,int n o n 2 return s2 int maxseqsum2 const int a,int n o n else if s1 0 return s2 int maxseqsum3...