LeetCode 三個無重疊子陣列的最大和

2021-09-19 13:01:02 字數 2885 閱讀 5361

給定陣列 nums 由正整數組成,找到三個互不重疊的子陣列的最大和。

每個子陣列的長度為k,我們要使這3*k個項的和最大化。

返回每個區間起始索引的列表(索引從 0 開始)。如果有多個結果,返回字典序最小的乙個。

示例:

輸入: [1,2,1,2,6,7,5,1], 2

輸出: [0, 3, 5]

解釋: 子陣列 [1, 2], [2, 6], [7, 5] 對應的起始索引為 [0, 3, 5]。

我們也可以取 [2, 1], 但是結果 [1, 3, 5] 在字典序上更大。

注意:

nums.length的範圍在[1, 20000]之間。

nums[i]的範圍在[1, 65535]之間。

k的範圍在[1, floor(nums.length / 3)]之間。

思路分析:這道題如果直接暴力搜尋肯定是過不了的,我們首先需要知道題中只要求三個子陣列,如果我們確定了中間子陣列的位置,則左右兩端的子陣列就確定了(我們可以在左右段分別取最大的子陣列和即可)。

中間子陣列的起始位置 for (int midindex = k; midindex <= numssize - 2 * k; ++midindex)

在中間子陣列確定條件下,左端子陣列起始下標存在的位置 for (int index = 0; index <= midindex - k; ++index)

在中間子陣列確定條件下,右端子陣列起始下標存在的位置 for (int index = midindex + k; index <= numssize - k; ++index)

不過我們還需要知道,如果快速求乙個陣列中某一段的和。請參考 leetcode 區域和檢索

vectorsums(numssize + 1, 0);//sums[i]代表的是nums[0, i - 1]的和

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

完整**如下:

class

solution

//midindex代表的是中間子陣列的起始下標

for(

int midindex = k; midindex <= numssize -

2* k;

++midindex)

}//threeindex代表的第三個子陣列是在[midindex + k, numssize - 1]這一段取得最大子陣列和的下標

for(

int index = midindex + k; index <= numssize - k;

++index)

}//sums[midindex + k] - sums[midindex]代表的以midindex為起始的子陣列的和,

//如果此時三個子陣列的和超過了已經找到的最大結果,更新

下面將對上面的**進行優化,不難發現上面的每次確定乙個midindex後,都是去重新尋找leftbeginindex和rightbeginindex,這個過程顯然是重複多餘的,我們只要尋找一遍即可。因為對於給定的乙個index,在[0, index]中尋找和最大的子陣列是乙個定值,在[index + k, numssize - 1]中尋找和最大的子陣列也是乙個定值。

我們使用三個陣列 vectorsums(numssize + 1, 0), maxleftsubindex(numssize , 0), maxrightsubindex(numssize, 0);

sums[i]表示的nums[0, i - 1]的求和

maxleftsubindex[index]表示的在[0, index - 1]尋找到的和最大長度為k的子陣列的起始下標

maxrightsubindex[index]表示的是在[index + k, numssize - 1]尋找到的和最大長度為k的子陣列的起始下標

具體實現**:

class

solution

//第二步:給定任意乙個index∈[k, numssize - 2 * k],確定第乙個子陣列最大和的起始下標

for(

int leftend = k, tempsum =

0; leftend <= numssize -

2* k;

++leftend)

else

}//第三步:給定任意乙個index∈[2 * k, numssize - k],確定第三個子陣列最大和的起始下標

for(

int threebegin = numssize - k, tempsum =

0; threebegin >=

2* k;

--threebegin)

else

}//第四步:確定中間陣列的下標段

三個數的和,leetcode問題

給定乙個包含 n 個整數的陣列 nums,判斷 nums 中是否存在三個元素 a,b,c 使得 a b c 0 找出所有滿足條件且不重複的三元組。注意 答案中不可以包含重複的三元組。例如,給定陣列 nums 1,0,1,2,1,4 滿足要求的三元組集合為 1,0,1 1,1,2 解法一 c 暴力求解...

三個數之和

b 問題 b 給定乙個由n個整數組成的陣列s,是否存在s中的三個數a,b,c使得 a b c 0?找出所有的不重複的和為0的三元組。注意 1.三元組的整數按照公升序排列 a0 c向前移一位,減小和 還要注意的是去掉重複的解,保證a和b都和上次的不同即可。如下 public class solutio...

三個數之和

給定乙個包含n個整數的陣列nums,判斷nums中是否存在三個元素a,b,c,使得a b c 0?請找出所有的三元組。答案不包含重複的三元組。python class solution def threesum self,nums if len nums 3 return res n len num...