42 最大子陣列

2022-05-12 02:33:39 字數 2376 閱讀 8879

原題**:

42. 最大子陣列 ii 

討論區 

給定乙個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。

每個子陣列的數字在陣列中的位置應該是連續的。

返回最大的和。

注意事項

子陣列最少包含乙個數

您在真實的面試中是否遇到過這個題? 

yes樣例給出陣列[1, 3, -1, 2, -1, 2]

這兩個子陣列分別為[1, 3][2, -1, 2]或者[1, 3, -1, 2][2],它們的最大和都是7

挑戰

要求時間複雜度為 o(n)

標籤

子陣列前後遍歷

列舉法陣列

貪心思路:

對這種求兩個陣列不重疊區間的問題我是真的非常容易大腦宕機,一上來就是確定兩個區間的邊界,不重疊時 end1 < begin2  --------一把心塞淚,這樣走下去當然是想不出解法的。

然後想到一種比較笨的解法,就是遍歷nums,每次遍歷陣列分為左側部分(0~i)和右側部分(i+1~n-1),再分別求左側部分最大子陣列和與右側部分最大子陣列和(又是兩個for迴圈),如果左右兩個最大子陣列和大於初始設定的sum(int型的最小值),就更新sum。這樣在編譯器執行正常,但是提交**到lintcode上就超出時間限制了。時間複雜度是o(n*n)。

想了下這個方法的主要問題是重複計算,在網上看了別人的答案後恍然大悟,可以用陣列將每次的運算結果儲存起來,即:

定義兩個陣列left與right,與nums等長,分別記錄每個位置左側最大子陣列和與右側最大子陣列和;

從左往右遍歷,計算i左側部分的最大子陣列和left【i】;

再從右往左遍歷,計算i右側部分的最大子陣列和right【i】;

遍歷left與right,left[k]+right[k+1]表示在第k位拆分陣列,得到其子陣列的和,找到最大值return出去就可以了。

參考:ac**:

class

solution

int n=nums.size();

vector

left(n,0

); vector

right(n,0

);

int maxsum1=nums[0],sum1=0

;

int maxsum2=nums[n-1],sum2=0

;

int i=0,j=n-1

;

for (;i)

if (sum1<0

)

left[i]=maxsum1;

}for (;j>=0;j--)

if (sum2<0

)

right[j]=maxsum2;

}int sum=left[0]+right[1

];

for (int k=1;k1;k++)//

k=n-1時left為整個nums的最大子陣列和,不符合子陣列不重疊要求,且right下標超出範圍;

}return

sum;

}};

還可以直接計算 0~k 與 k+1~n-1 部分的最大子陣列和,修改**如下:

class

solution

int n=nums.size();

vector

left(n,0

); vector

right(n,0

);

int maxsum1=nums[0],sum1=0

;

int maxsum2=nums[n-1],sum2=0

;

int i=0,j=n-1

;

for (;i//

計算0~k的最大子陣列和;

if (sum1<0

)

left[i]=maxsum1;

}for (;j>0;j--)//

計算k+1~n-1的最大子陣列和;

if (sum2<0

)

right[j-1]=maxsum2;

}int sum=left[0]+right[0

];

for (int k=1;k1;k++)//

k=n-1時left為整個nums的最大子陣列和,不符合子陣列不重疊要求;

}return

sum;

}};

42 最大子陣列差

2017.9.22 與最大子陣列的思路類似,只不多要尋找部分和的最大值和最小值 然後再進行比較。public class solution if size 2 int leftmax new int size int leftmin new int size leftmax 0 nums 0 lef...

LintCode 42 最大子陣列 II

給定乙個整數陣列,找出兩個 不重疊子陣列使得它們的和最大。每個子陣列的數字在陣列中的位置應該是連續的。返回最大的和。public class solution else if tmp max leftarray i max int rightarray new int nums.size max i...

lintcode練習 42 最大子陣列 II

給定乙個整數陣列,找出兩個 不重疊 子陣列使得它們的和最大。每個子陣列的數字在陣列中的位置應該是連續的。返回最大的和。給出陣列 1,3,1,2,1,2 這兩個子陣列分別為 1,3 和 2,1,2 或者 1,3,1,2 和 2 它們的最大和都是7 要求時間複雜度為 o n 子陣列最少包含乙個數 cla...