2哥 : 3妹翁垂,今年過(guò)年收到壓歲錢(qián)了沒(méi)呢铆遭。
3妹:切,我都多大了啊沿猜,肯定沒(méi)收了啊
2哥 : 俺也一樣枚荣,不僅沒(méi)收到,小侄子小外甥都得給啼肩,還倒貼好幾千
3妹:哈哈哈哈橄妆,2叔叔,也給我這個(gè)小侄女點(diǎn)壓歲錢(qián)啊
2哥 :切祈坠,沒(méi)啦沒(méi)啦
3妹:話說(shuō)你最大是多少歲開(kāi)始沒(méi)人給壓歲錢(qián)了昂艋?
2哥:emmm, 大概是16歲颁虐,上高中開(kāi)始的吧
3妹:那2哥,你收到的最大紅包是多少呢
2哥:5千卧须,是我奶奶給我的另绩。
2哥:好吧,回家不僅只有壓歲錢(qián)花嘶,也要刷題啊笋籽,今天有一道“最大”的題目, 讓我們先做一下吧~
題目:
給你一個(gè)長(zhǎng)度為 n 的數(shù)組 nums 和一個(gè) 正 整數(shù) k 椭员。
如果 nums 的一個(gè)子數(shù)組中车海,第一個(gè)元素和最后一個(gè)元素 差的絕對(duì)值恰好 為 k ,我們稱這個(gè)子數(shù)組為 好 的隘击。換句話說(shuō)侍芝,如果子數(shù)組 nums[i..j] 滿足 |nums[i] - nums[j]| == k ,那么它是一個(gè)好子數(shù)組埋同。
請(qǐng)你返回 nums 中 好 子數(shù)組的 最大 和州叠,如果沒(méi)有好子數(shù)組,返回 0 凶赁。
示例 1:
輸入:nums = [1,2,3,4,5,6], k = 1
輸出:11
解釋:好子數(shù)組中第一個(gè)元素和最后一個(gè)元素的差的絕對(duì)值必須為 1 咧栗。好子數(shù)組有 [1,2] ,[2,3] 虱肄,[3,4] 致板,[4,5] 和 [5,6] 。最大子數(shù)組和為 11 咏窿,對(duì)應(yīng)的子數(shù)組為 [5,6] 斟或。
示例 2:
輸入:nums = [-1,3,2,4,5], k = 3
輸出:11
解釋:好子數(shù)組中第一個(gè)元素和最后一個(gè)元素的差的絕對(duì)值必須為 3 。好子數(shù)組有 [-1,3,2] 和 [2,4,5] 翰灾。最大子數(shù)組和為 11 稚茅,對(duì)應(yīng)的子數(shù)組為 [2,4,5] 。
示例 3:
輸入:nums = [-1,-2,-3,-4], k = 2
輸出:-6
解釋:好子數(shù)組中第一個(gè)元素和最后一個(gè)元素的差的絕對(duì)值必須為 2 亚享。好子數(shù)組有 [-1,-2,-3] 和 [-2,-3,-4] 绘面。最大子數(shù)組和為 -6 ,對(duì)應(yīng)的子數(shù)組為 [-1,-2,-3] 揭璃。
提示:
2 <= nums.length <= 10^5
-10^9 <= nums[i] <= 10^9
1 <= k <= 10^9
思路:
前綴和, 具體解法見(jiàn)代碼。
java代碼:
class Solution {
public long maximumSubarraySum(int[] nums, int k) {
long ans = Long.MIN_VALUE;
long sum = 0;
Map<Integer, Long> minS = new HashMap<>();
for (int x : nums) {
long s1 = minS.getOrDefault(x - k, Long.MAX_VALUE / 2);
long s2 = minS.getOrDefault(x + k, Long.MAX_VALUE / 2);
ans = Math.max(ans, sum + x - Math.min(s1, s2));
minS.merge(x, sum, Math::min);
sum += x;
}
return ans > Long.MIN_VALUE / 4 ? ans : 0;
}
}