1. 程式人生 > >152. Maximum Product Subarray 解題記錄

152. Maximum Product Subarray 解題記錄

排序 bool fin 第一次 解題思路 擴大 可能 因此 font

題目描述:

Find the contiguous subarray within an array (containing at least one number) which has the largest product.

For example, given the array [2,3,-2,4],
the contiguous subarray [2,3] has the largest product = 6.

解題思路:

這道題可分為兩種情況:

1) 有非0的元素,首先分析當數組中有<0的元素,可分為2種情況:

  1)個數為偶數,這種情況只要把元素全乘一遍就會得到最大值;

  2)個數為奇數,首先看一個例子:

[-1, -2, -3, -4, -5]

//因為題目所要求返回的最大乘積,所以可以排除無用的排序將其分為兩個數組
[-1, -2, -3, -4]

[-2, -3, -4, -5]

    因此,奇數的情況只有兩種可能性,分別是 從第一個元素乘到倒數第二個負數 和 從第二個負數乘到最後一個元素。

   而>0的元素沒有絲毫的影響,乘過去即可。就算負數與負數的中間或是前面或是後面夾雜著正數也只是擴大最後的結果。

2) 有0的元素,無論哪個數乘0都為0,所以0就相當一個終止符,把一個數組劃分成兩個數組。

代碼:

 1 class Solution {
 2
public: 3 int maxProduct(vector<int>& nums) { 4 int maxAll = nums[0], n = nums.size(); 5 int first = 1, second = 1; 6 bool flag = 0; //是否遇到負數標誌 7 for(int i = 0; i < n; i++){ 8 first *= nums[i]; 9 second *= nums[i]; 10 maxAll = maxAll>first?maxAll:first; //
負數是奇數的第一個情況 11 maxAll = maxAll>second?maxAll:second; //奇數的第二個情況 12 if(nums[i] < 0 && !flag){ 13 //第一次遇到負數 14 second = 1; 15 flag = 1; 16 } 17 if(nums[i] == 0){ 18 //遇到0的情況 19 maxAll = 0>maxAll?0:maxAll; 20 flag = 0;-5 21 first = 1; 22 second = 1; 23 } 24 } 25 return maxAll; 26 } 27 };

152. Maximum Product Subarray 解題記錄