Java后端
·2025-02-19😘昨天玩出去和朋友shopping了,今日继续。
😅leetcode hot 100 * 2
和为 K 的子数组。为了这道,先刷了前缀和303. 区域和检索 - 数组不可变。主要就是了解前缀和概念。直接做这题暴力双层循环也做出来能通过。主要是看看前缀和优化思路:通过利用前缀和数组,获取统计每个前缀和出现次数。根据前缀和概念,i到j-1的前缀和满足 s[j] = s[i] + k。k = s[j] - s[i]。通过统计从i到j-1的子序列和为k出现次数。相比双层for优化通过map用O(1)的时间复杂度获取到对应子序列的数量。
public int subarraySum(int[] nums, int k) {
int[] s = new int[nums.length+1];
// 计算前缀和 s[0] = 0,
for(int i=0;i<nums.length;i++){
s[i+1] = s[i] + nums[i];
}
int res = 0;
// key:前缀和,value:出现次数
Map<Integer,Integer> map = new HashMap<>();
// s[j] = s[i] + k
for(int j=0;j<s.length; j++){
// s[j] - k : s[0~j] - s[0~i] = k,说明差值中就是对应子序列
res += map.getOrDefault(s[j] - k , 0);
// 重新计算当前,前缀和出现数量
map.put(s[j], map.getOrDefault(n, 0) + 1);
}
return res;
}
😒239. 滑动窗口最大值。看着题目就来思路了,一顿操作。超时mmp。困难题果然没这么简单。
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res = new int[nums.length-k+1];
for(int l=0,r=0; r<nums.length;r++){
if(r-l+1 < k){ // 初始化窗口
continue;
}
int curMax = nums[l];
for(int i=0;i<k;i++){
curMax = Math.max(curMax,nums[l+i]);
}
res[l] = curMax;
l++;
}
return res;
}
🤔想了想通过前缀和优化,思考中。。。
🥱域名认证等待中。
🥱软考专项刷题doing。
👿最近开始颓废了,竟然没有巩固面试题。不能这样了。没想到软考竟让我如此憔悴,自今日起一起上。
🥹再有就是重新准备简历,试试行情,练练手感。
3
0
分享
操作
评论
问答助学
相关内容
0个评论
全部评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
