劍指offer系列 30 連續子陣列的最大和

2022-06-24 10:00:12 字數 1409 閱讀 1807

q:hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)

t:1.對於乙個數a,若是a的左邊累計數非負,那麼加上a能使得值不小於a,認為累計值對整體和是有貢獻的。如果前幾項累計值負數,則認為有害於總和,total記錄當前值。

注意:c++中表示正無窮是inf_max,負無窮是inf_min,需要 #include

int findgreatestsumofsubarray(vectorarray) 

return max;

}

2.動態規劃法:遍歷陣列,定義乙個變數來儲存當前向量子串行最大值,\(f(i)=max(f(i-1)+array[i] , array[i])\)。

int findgreatestsumofsubarray(vectorarray) 

return result;

}

3.分治法:

考慮將陣列從中間分為兩個子陣列,則最大的比出現在三種情況之一

完全位於左邊陣列

完全位於右邊陣列

跨越中點,包含左右陣列靠近中點的部分

具體實現: 遞迴左右子陣列再分為兩個陣列,直到子陣列只有乙個元素

int findgreatestsumofsubarray(vectorarray) 

int find(vectorarray, int left, int right)

int mid = (left + right) / 2;

//跨越中點,包含左右陣列靠近中點的部分

int maxleftm = int_min;

int temp = 0;

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

int maxrightm = int_min;

temp = 0;

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

int maxmid = maxleftm + maxrightm;

//完全位於左邊陣列

int maxleft = find(array, left, mid);

//完全位於右邊陣列

int maxright = find(array, mid + 1, right);

return max(maxright, max(maxmid, maxleft));

}

劍指Offer 30 連續子陣列的最大和

題目 輸入乙個整型陣列,陣列裡有正數也有負數。陣列中乙個或連續的多個整數組成乙個子陣列。求所有子陣列的和的最大值。要求時間複雜度為o n 如輸入陣列 1,2,1,0,3,9 輸出3。我在美團的二面碰到了這道題,當時的想法是不斷構建可變陣列,與預設值即全部元素和比較,得出結果,複雜度o n 2 面試官...

劍指offer 30 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...

劍指offer 30 連續子陣列的最大和

hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第...