給你乙個整數陣列 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代表兩個...