求兩個子陣列最大的累加和

2021-07-16 16:01:28 字數 1021 閱讀 7216

來自牛客網左程雲演算法第二堂課第一題

問題:給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。

要求: 時間複雜度達到 o(n)

解法:我們很容易想到將整個陣列分成兩個部分,然後分別求這兩個部分子陣列的最大累加和。將結果累加起來。那麼將陣列分成不重合兩部分(相鄰的兩部分)有n-1種分法,根據演算法原型就是leetcode 53. maximum subarray 子陣列最大和,求子陣列最大和的時間複雜度是o(n),整體的時間複雜度達到了o(n*n)。那麼如何將時間複雜度降到o(n)呢?分析我們的演算法原型,其中的max會儲存遍歷到當前位置的子陣列的最大和,我們可以將這個值儲存起來,這樣我們就可以用o(1)的時間複雜度得到當前子陣列的最大累加和。整體的時間複雜度也是o(n)級別的。由於我們要將陣列分成兩部分,預處理時,我們需要計算一遍從右到左的子陣列最大和,這樣右邊的部分我們也可以直接拿到它的子陣列最大累加和,左邊的部分我們不用陣列儲存,因為我們是從左到右遍歷的,只用乙個變數儲存即可。這是我們用空間換時間的乙個方法。額外空間複雜度為o(n)。

public int maxtwosubarray(int nums) 

int h = new int[nums.length];

h[h.length - 1] = nums[nums.length - 1];

int cur = h[h.length - 1];

for (int i = h.length - 2; i >= 0; i--)

} int max = integer.min_value;

int lmax = integer.min_value;

cur = 0;

for (int i = 0; i < nums.length - 1; i++)

system.out.println(lmax + " " + h[i+1] + " " + i + " " + max);

} return max;

}

求兩個子陣列最大的累加和

最近在學習演算法,發現左神左程雲講的是真的好,相見恨晚,推薦大家去學習。題目 給定乙個陣列,其中當然有很多的子陣列,在所有兩個子陣列的組合中,找到相 加和最大的一組,要求兩個子陣列無重合的部分。最後返回累加和。要求 時間複雜度達到 o n 這道題要想做的順利,首先我們先需要知道乙個演算法原型,也就是...

陣列拆分為兩個子陣列

怎麼把乙個陣列拆分成兩個非空的子陣列,而且如果兩個陣列裡的元素能夠一一對應,那麼不論順序如何,都認為是重複的 例如和是一樣的。輸入例子 1,2,3輸出例子 1 2 32 1 3 1 3 2也一樣 3 1 2輸入例子 1 2 2輸出例子 1 2 2 2 2 1 2 12 2 1 21.遞迴求解,去重 ...

兩個子串行的最大點積

給你兩個陣列nums1和nums2。請你返回nums1和nums2中兩個長度相同的非空子串行的最大點積。陣列的非空子序列是通過刪除原陣列中某些元素 可能乙個也不刪除 後剩餘數字組成的序列,但不能改變量字間相對順序。比方說,2,3,5 是 1,2,3,4,5 的乙個子串行而 1,5,3 不是。示例 1...