hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如:,連續子向量的最大和為8(從第0個開始,到第3個為止)。給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?(子向量的長度至少是1)
leetcode對應題目:53、最大子序和
leetcode課程裡面(九)動態規劃講過
總結:dp的經典題目,沒想到dp[i]的狀態表示的確很難做。
1、若dp儲存的是到第i個元素的最大陣列和可以麼?
不可以,[1,1,-4,5],若中間有個很大的負數,dp[3] = 7,然而題目要求是連續陣列!
2、dp儲存的是:以第i個元素結尾的最大和。可!因為這樣保證了dp[i-1],nums[i],dp[i]三者之間的關係
class solution
vectordp(nums.size()+1,0);
int max_res = int_min;
for(int i = 1 ; i <= nums.size(); i++)
return max_res;
}};
優化:dp陣列是沒必要的,因為我們每次只跟前面乙個陣列元素有關,直接用乙個變數來儲存就可以了。
class solution
return max_res;
}};
或者:
class solution
else
if(presum > max) max = presum;
}return max;
}};
用分治也可以做:
我們需要把陣列一分為二,分別找出左邊和右邊的最大子陣列之和,然後還要從中間開始向左右分別掃瞄,求出的最大值分別和左右兩邊得出的最大值相比較取最大的那乙個。
class solution
int helper(vector&nums,int left,int right)
t = midmax;//此時t表示從mid開始的左側連續子陣列之和
for(int i = mid+1;i<=right;i++)
return max(midmax,max(leftmax,rightmax));
}};
30 連續子陣列的最大和
題目描述 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個...
30 連續子陣列的最大和
題目描述 hz偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了 在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個...
30連續子陣列的最大和
在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊的正數會彌補它呢?例如 連續子向量的最大和為8 從第0個開始,到第3個為止 給乙個陣列,返回它的最大連續子串行的和,你會不會被他忽悠住?子向量的長度至...