描述
給定乙個整數陣列,找出兩個不重疊的子陣列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 ...