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個開始,到第...