Java核心技术_卷
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。 👿最近开始颓废了,竟然没有巩固面试题。不能这样了。没想到软考竟让我如此憔悴,自今日起一起上。 🥹再有就是重新准备简历,试试行情,练练手感。
0个评论
点击登录,快来和大家讨论吧~
表情
图片
暂无评论
下载 APP