輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。 求所有子陣列的和的最大值,要求時間複雜度為o(n)。
例如輸入的陣列為1, -2, 3, 10, -4, 7, 2, -5,和最大的子陣列為3, 10, -4, 7, 2, 因此輸出為該子陣列的和18。
第乙個想法肯定就是如果能夠把陣列的所有子陣列之和給列出來,那麼就可以很容易的找到最大子陣列和,但是這樣複雜度太高,那麼有沒有一種比較簡單的方法呢?
首先還是先讓我們來分析一下給定的例子陣列1, -2, 3, 10, -4, 7, 2, -5。
那麼這裡面有沒有乙個特定的規律,可以用於我們判斷在遇到負數的時候是繼續往後面選擇元素加入該陣列呢,還是可以直接從後面的陣列開始新的子陣列呢?令cursum表示當前子陣列的和,maxsum表示最大子陣列之和,根據判斷我們可以知曉,若cursum + a[i] >= a[i]的話,那麼就將a[i]加入該子陣列,否則,就從a[i]開始重新計算新的子陣列之和。具體**如下:
#includeusing namespace std;
int maxsubarray(int* a, int len)
return maxsum;
}int main();
int length = sizeof(a)/sizeof(a[0]);
cout << maxsubarray(a, length) << endl;
return 0;
}
如果陣列是二維陣列,同樣要你求最大子陣列的和?
若陣列是二維陣列,那麼我們首先要弄清楚二維陣列與一維陣列本質上有什麼區別?
二維陣列a[2][4] = ,}
一維陣列a[8] =
其實二維陣列在本質上跟一維陣列是可以等同的,例如上面的二維陣列中a[1][3] = a[1x4+3] = a[7] = 4, 這樣的話那麼如果是二維陣列求最大子陣列的和跟一維陣列用的方法是一樣的,不過是將陣列的形式改變一下。
如果是要你求子陣列的最大乘積?
分析:(整數陣列分析)求最大乘積,本質上是要判斷0的數目和負數的數目。
若陣列中負數的個數為偶數,並且全部非0,那麼自然是所有的數相乘最大;
若陣列中的負數為奇數個,並且全部非0,那麼肯定就是要排除乙個負數,並且是首部(或者尾部)的那個負數及其前面(或者後面的)的數需要被捨棄掉,這裡需要有乙個判斷;
若陣列中存在0,那麼陣列需要以0為界劃分為多個陣列,然後重複第一步和第二步,計算出最大的乘積。
**如下:
#includeusing namespace std;
int localmaxsubarray(int *a, int begin, int end) else
curproduct = 1;
for(int i=negativearray[0]+1; imaxproduct)
}return maxproduct;
}int maxsubarray(int* a, int len)
curproduct = localmaxsubarray(a, zeroarray[zeronum-1]+1, len);
if(curproduct > maxproduct)
maxproduct = curproduct;
}return maxproduct;
}int main();
int length = sizeof(array)/sizeof(array[0]);
cout << maxsubarray(array, length) << endl;
return 0;
}
如果同時要求輸出子段的開始和結束?
分析:(整數陣列分析)要求子陣列的首尾序號,這是乙個比較簡單的問題,具體**如下所示:
#includeusing namespace std;
void maxsubarray(int *a, int len) else
if(cursum > maxsum)
}cout << "begin: " << begin << " end: " << end << " maxsum: " << maxsum << endl;
}int main();
int a = ;
int length = sizeof(a)/sizeof(a[0]);
maxsubarray(a, length);
return 0;
}
最大連續子陣列和
題目描述 輸入乙個整形陣列,陣列裡有正數也有負數。陣列中連續的乙個或多個整數組成乙個子陣列,每個子陣列都有乙個和。求所有子陣列的和的最大值,要求時間複雜度為o n 例如輸入的陣列為 1,2,3,10,4,7,2,5 和最大的子陣列為 3,10,4,7,2 因此輸出為該子陣列的和18。思路 採用貪婪法...
最大連續子陣列和
給定乙個整數陣列,元素的值有正有負。定義 連續子陣列和 為連續幾個陣列的元素的和,求最大的連續子陣列和。已知這個值在int能夠表示的範圍內。無腦暴力做就是列舉所有的子陣列,o n 2 然後對於每個子陣列求和,自然就找出最大的了,複雜度總共是o n 3 能否優化?想想 做了重複多餘的事情了?沒錯,就是...
最大連續子陣列和
問題是這樣的 乙個整數陣列中的元素有正有負,在該陣列中找出乙個連續子陣列,要求該連續子陣列中各元素的和最大,這個連續子陣列便被稱作最大連續子陣列。比如陣列的最大連續子陣列為,最大連續子陣列的和為5 2 1 2 8。下面按照時間複雜度逐步優化的順序依次給出這三種演算法。該方法的思想非常簡單,先找出從第...