leetcode 找兩個和為目標值且不重疊的子陣列

2021-10-07 13:14:03 字數 1421 閱讀 4159

給你乙個整數陣列 arr 和乙個整數值 target 。

請你在 arr 中找 兩個互不重疊的子陣列 且它們的和都等於 target 。可能會有多種方案,請你返回滿足要求的兩個子陣列長度和的 最小值 。

請返回滿足要求的最小長度和,如果無法找到這樣的兩個子陣列,請返回 -1 。

示例 1:

輸入:arr = [3,2,2,4,3], target = 3

輸出:2

解釋:只有兩個子陣列和為 3 ([3] 和 [3])。它們的長度和為 2 。

示例 2:

輸入:arr = [7,3,4,7], target = 7

輸出:2

解釋:儘管我們有 3 個互不重疊的子陣列和為 7 ([7], [3,4] 和 [7]),但我們會選擇第乙個和第三個子陣列,因為它們的長度和 2 是最小值。

示例 3:

輸入:arr = [4,3,2,6,2,3,4], target = 6

輸出:-1

解釋:我們只有乙個和為 6 的子陣列。

示例 4:

輸入:arr = [5,5,4,4,5], target = 3

輸出:-1

解釋:我們無法找到和為 3 的子陣列。

示例 5:

輸入:arr = [3,1,1,1,5,1,2,1], target = 3

輸出:3

解釋:注意子陣列 [1,2] 和 [2,1] 不能成為乙個方案因為它們重疊了。

我們設dp[i]表示前i個元素中存在的連續子陣列和為target的最小長度。

由於陣列中所有的數都為正數,所以我們可以利用hash值來快速查詢以索引i為結尾且和為target的連續子陣列是否存在,如果存在則它的長度肯定是唯一的,我們可以利用hash[sum-target]]快速的得該連續子陣列的最左的起點位置索引j,即可快速求出連續子陣列的長度.我們用len(target,i)代表和為target且最右邊的終點為索引i的連續子陣列的長度。則可以得到公式為:

minsum=

min(minsum,

len(target,i)

+dp[i−len

(target,i)])

(iflen

(target,i)

>0)

dp[i]

=min

(dp[i−1],

len(target,i))(

iflen

(target,i)

>

0)

**:

class solution

dp[i]

=min

(dp[i]

,i - prev);}

}if(res > n)

return-1

;return res;}}

;

找和為k的兩個元素

今天在做coursera上的練習題時,遇到了乙個找和為k的兩個元素的問題,按照常規的方法,將資料存入陣列中,一次為每個數字遍歷陣列,找到是否存在和為k的元素,但是這樣的話時間複雜度為o n 2 恰好前兩天剛看過快速排序的思想,發現,使用快速排序,可以優化降低時間複雜度。找和為k的兩個元素 描述在乙個...

Leetcode 和為s的兩個數字

輸入乙個遞增排序的陣列和乙個數字s,在陣列中查詢兩個數,使得它們的和正好是s。如果有多對數字的和等於s,則輸出任意一對即可。示例 1 輸入 nums 2,7,11,15 target 9 輸出 2,7 或者 7,2 示例 2 輸入 nums 10,26,30,31,47,60 target 40 輸...

leetcode 52 找兩個鍊錶第乙個交點

如下 示例 definition for singly linked list.public class listnode public class solution return a 整體思路 如果兩個鍊錶有交點,那麼我們可以設第一條鍊錶a長度為l1 c,第二條鍊錶b長度為l2 c,其中c代表兩個...