陣列 最大子陣列差 中等

2021-08-20 09:17:24 字數 1842 閱讀 5427

描述

給定乙個整數陣列,找出兩個不重疊的子陣列a和b,使兩個子陣列和的差的絕對值|sum(a) - sum(b)|最大。

返回這個最大的差值。

子陣列最少包含乙個數

樣例給出陣列[1, 2, -3, 1],返回 6

挑戰時間複雜度為o(n),空間複雜度為o(n)

題目鏈結

分析

該問題和最大子陣列ii類似,但是這裡是求最大子陣列差。假設存在a和b兩個陣列

當a足夠大的時候,b足夠小的時候,需要從左向右求最大連續陣列left,從右向左求最小連續陣列right,遍歷left,right陣列,left[i]-right[i+1]表示在第i位拆分陣列,得到其子陣列的差。

當b足夠大的時候,a足夠小的時候,需要從左向右求最小連續陣列left,從右向左求最大連續陣列right,

遍歷left,right陣列,left[i]-right[i+1]表示在第i位拆分陣列,得到其子陣列的差。

求取兩次子陣列的最大值,即為最大子陣列差。

程式

class solution 

for (int i = 0; i < size; i++)

cout << left_max[i] << " ";

cout << endl;

int *right_min = new int[size];

int min_value;

right_min[size - 1] = min_value = sum = nums[size - 1];

for (int i = size - 2; i >= 0; i--)

for (int i = 0; i < size; i++)

cout << right_min[i] << " ";

cout << endl;

int result1 = 0x80000000;

for (int i = 0; i < size - 1; i++)

cout << result1 << endl;

delete left_max;

delete right_min;

// a矩陣足夠小,b矩陣足夠大

int *left_min = new int[size];

left_min[0] = min_value = sum = nums[0];

cout << "hello" << endl;

for (int i = 1; i < size; i++)

for (int i = 0; i < size; i++)

cout << left_min[i] << " ";

cout << endl;

int *right_max = new int[size];

right_max[size - 1] = max_value = sum = nums[size - 1];

for (int i = size - 2; i >= 0; i--)

for (int i = 0; i < size; i++)

cout << right_max[i] << " ";

cout << endl;

int result2 = 0x80000000;

for (int i = 0; i < size - 1; i++)

cout << result2 << endl;

delete left_min;

delete right_max;

return max(result1, result2);

}};

最大子陣列差

給定乙個整數陣列,找出兩個不重疊的子陣列a和b,使兩個子陣列和的差的絕對值 sum a sum b 最大。返回這個最大的差值。樣例給出陣列 1,2,3,1 返回 6 注意子陣列最少包含乙個數 挑戰時間複雜度為o n 空間複雜度為o n class solution return result pri...

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

描述 給定乙個整數陣列,找出兩個不重疊的子陣列a和b,使兩個子陣列和的差的絕對值 sum a sum b 最大。返回這個最大的差值。子陣列最少包含乙個數 樣例 給出陣列 1,2,3,1 返回 6 挑戰 時間複雜度為o n 空間複雜度為o n 思路 構建相應的陣列formax i 表示從nums 0 ...