C 中求陣列的子陣列之和的最大值

2022-01-18 12:06:31 字數 3751 閱讀 8600

《程式設計之美》183頁,問題2.14——求子陣列的字陣列之和的最大值。(整數陣列)

我開始以為可以從陣列中隨意抽調元素組成子陣列,於是就有了一種想法,把最大的元素抽出來,判斷是大於0還是小於等於0,如果大於0就對除了這個最大值外剩下的陣列部分進行遞迴:

using

system;

using

system.collections.generic;

using

system.linq;

namespace

maxsumsubarray

; list

subarray = new list();

if (array.max() > 0

)

else");

}console.readline();

}private

static

void printarray(listsubarray)

}private

static

void maxsumsubarray(list array, listsubarray)}}

}

view code

這樣做其實就是我想麻煩了,因為最後的結果證明,這樣做和遍歷陣列把大於0的元素都抽出來是一樣的,根本用不著遞迴:

如果陣列中沒有正整數,那就變成求陣列中最大值的問題了。t.t

後來看答案發現,題中說的子陣列還必須得是連續的,不能隨便抽調。於是開始重新想問題……

我發現,連續子陣列的和是不是最大的,要把所有的子陣列都找出來以後才能確定。

那沒什麼好辦法了,只能遍歷了,首先從第乙個元素開始,第乙個子陣列就是第乙個元素本身,第二個子陣列就是第乙個元素和第二個元素組成的,第三個……

然後從第二個元素開始……

等把這些子陣列都列出來以後,分別加和,比較一下哪個最大哪個就是目標子陣列了。

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

namespace

maxsumsubarray

; list

int>> subarrays = new listint>>();

int subsum = 0

;

int origin = 0

;

for (int k = 1; k <= array.count(); k++)

subarrays[origin].add(subsum);

origin++;

subsum = 0

; }

}int max = subarrays[0][subarrays[0].count() - 1

];

int destination = 0

;

for (int i = 0; i < subarrays.count(); i++)

}printarray(subarrays[destination]);

console.readline();

}private

static

void printarray(listarray)

console.writeline();

console.writeline(

"the sum of the array is:

" + array[array.count() - 1

]); }}}

這裡我用了泛型陣列的巢狀,因為泛型陣列是動態的,所以巢狀的泛型陣列就相當於乙個動態的二維陣列:

listint>> subarrays = new listint>>();
subarrays陣列中每乙個元素都是乙個整型陣列list。

接下來是三層for迴圈:

最內層的for迴圈就是從陣列的某乙個元素一直加到某乙個元素;

中層for迴圈是從陣列某乙個元素開始,一直到最後乙個元素;

最外層的for迴圈是用來指定子陣列的首元素。

通過三層for迴圈就可以求出所有的子陣列以及他們的和,我把每乙個子陣列都做為乙個元素存在list型陣列中,並且int型陣列中的最後一位元素用來存子陣列的和。

接下來我們遍歷所有子陣列的末尾元素,比較出所有子陣列中和最大的子陣列並將其列印。

至此,我們就求出了陣列中和最大的子陣列:

以上就是經過我的思考所得出的解法。對比書中的解法發現我的解法基本上是書中寫的沒有優化過的解法一,但細節實現不一樣,我的方法不光可以找出最大子陣列和,還可以列印對應陣列。書中說可以省略一層for迴圈來避免重複計算對演算法進行優化,但是我沒想通,改成書中說的那樣發現測試結果不對。如果哪位高手有好意見,請給出優化**。qqq~!——2015.11.18

2015.12.29我又在網上看到了這個題,於是又經過一番思考,得出了一種新的解法,思路如下:

1、如果陣列中全是非正數,則最大子陣列就是該陣列的最大值。這種情況下,根本就不需要繼續遍歷,極大的減少了計算量,直接得出答案。

2、如果陣列中全是非負數,則最大字陣列就是該陣列本身。這種情況下,根本就不需要繼續遍歷,極大的減少了計算量,直接得出答案。

3、陣列中有正數也有負數,則最大子陣列的開頭肯定是非負數,結尾也肯定為非負數!也就是說,子陣列的核心成員就鎖定在那些非負數上。我要找出陣列中所有的非負數,記錄他們在陣列中的位置。最終的目標是計算每兩個非負數在陣列中的距離。(即兩個非負數以及其之間的數所組成的子陣列的和)

**如下:

using

system;

using

system.collections.generic;

using

system.linq;

namespace

maxsubarray

;int a = ;

//select the ones >=0.

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

}//calc all the sums.

calcresults(a);

//output the final result.

console.writeline(results.max());

console.read();

}private

static

void calcresults(int

array)}}

private

static

int calcsum(int

from, int to, int

array)

return

sum;}}

}

這裡主要用到了三個方法:

1、方法一:計算陣列中兩點之間元素所組成的子陣列的和;

2、方法二:計算出所有的非負數元素間的組合情況,並用方法一求出兩個非負數元素之間所組成的子陣列的和;

3、方法三:找出這些和中最大的值就是最大子陣列的和。

該方法主要的思想是縮小了搜尋範圍,分況治之。

求陣列的子陣列之和最大值

題目 乙個有n個整數元素的一維陣列a 0.n 1 這個陣列當然有很多子陣列,那麼子陣列之和最大值是多少?解答 求子陣列之和最大,這裡是連續的子陣列,如果乙個數為負數,陣列之和會減少,記住最大值,只要陣列之和沒有小於0就可以繼續累加,比如,3到 1子陣列之和減小了,但是沒有小於0,可以繼續累加下乙個數...

求陣列的子陣列之和的最大值

本題的要求顯然是o n 級的複雜度咯 結合書上的分析,可以發現如下條件 從陣列右邊像左遍歷,當前下標為i,那麼最大值有3中情形 1.最大值為array i 2.最大值為array i maxsuminclude 3.最大值為不包括array i 的maxsumexclude 最後返回最大值 max ...

求陣列的子陣列之和的最大值

乙個有n個整數元素的一維陣列 a 0 a 1 a n 2 a n 1 這個陣列當然有很多子陣列,那麼子陣列之和的最大值是什麼呢?下面將給出3種解法的 解法一 int max maxsum1 int a,int n return maxnum 分析 該演算法的複雜度為o n2 解法二 思路 我們考慮陣...