程式設計之美2 14 求陣列的子陣列之和的最大值

2021-06-26 07:54:21 字數 1624 閱讀 2922

這是乙個在面試中出現概率很高的一道題目,就拿我來說吧,面試了5家公司中,兩家公司問了這道題目,可見,這道題目是非常經典的。

解題思想也不是很難,我熟悉的有;兩種解題辦法:

1. 一直連加,終止當前序列的條件是連加的和是負數

因為,乙個數加上乙個負數之後肯定是沒有原來的數值大,所以,這肯定是沒有意義的,最終,我們利用這個思想得到如下的解法。

函式宣告:

ll dutmaxseqsubarray_1(int*, int);

typedef long long ll;

源**:

/*非常常見的最大連續子陣列的解法*/

bool _dutmaxseqsubarray = false;

ll dutmaxseqsubarray_1(int* a, int size)

ll result = 1 << 31;

ll currentsum = 0;

/*迴圈走一遍陣列,遇到加和為負數時就開始下一輪加和*/

for (int i = 0; i < size; ++i)

return result;

}

2. 動態規劃的思想:連續子陣列最大和也一定是以某乙個值結尾

無論連續子陣列有幾個數,也不論和是多大,它總是以乙個數結束的,而那個數肯定也是出現在陣列中,所以,可以得到如下的遞推公式:

以當前數結尾的最大連續子陣列之和是:

pdata[i] = pdata[i - 1] + a[i] || a[i]

所以,可以得到如下的解法:

函式宣告:

ll dutmaxseqsubarray_2(int*, int);

源**:

/*動態規劃的解法*/

ll dutmaxseqsubarray_2(int* a, int size)

ll result = 1 << 31;

ll currentsum = 0;

for (int i = 0; i < size; ++i)

return result;

}

用到的模板函式:

template t dutmax(t data1, t data2)

程式設計之美2 14 求陣列的子陣列之和的最大值

問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a n 1 它包含很多子陣列,求子陣列之和的最大值,當陣列元素全部為負的時候,有兩種處理辦法,第一種是返回0,第二種是返回陣列中最大的負數。解法1 使用暴力法,假設最大的一段陣列為a i a j 則對i 0 n 1 j i n 1,遍歷一遍,求...

程式設計之美 2 14 求陣列的子陣列之和的最大值

這個以前寫過,見求陣列的最長子陣列之和的最大值 這裡說一下後面擴充套件題目。1.簡述 1 如果陣列首尾相連,即允許找到一組數字 a i a n 1 a 0 a j 請使其和最大,怎麼辦?2 如果題目要求返回最大子陣列的位置,演算法應該如何改變?還能保持o n 的複雜度麼?2.思路 第乙個問題,書上給...

程式設計之美2 14 求陣列的子陣列之和的最大值

問題描述 乙個有n個整數元素的一維陣列 a 0 a 1 a 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列之和的最大值是什麼呢?解法 1.暴力解法 o n 3 2.改進版暴力解法 o n 2 3.分治演算法 o nlogn 暫時未去實現 4.陣列間關係法 o n 具體思路和 1.暴力解法 思路...