力扣hot100(9-找到字符串中所有字母异位词;10-和为K的子数组)
方法一滑动窗口class Solution { public ListInteger findAnagrams(String s, String p) { int sLen s.length(), pLen p.length(); if (sLen pLen) { return new ArrayListInteger(); } ListInteger ans new ArrayListInteger(); int[] sCount new int[26]; int[] pCount new int[26]; for (int i 0; i pLen; i) { sCount[s.charAt(i) - a]; pCount[p.charAt(i) - a]; } if (Arrays.equals(sCount, pCount)) { ans.add(0); } for (int i 0; i sLen - pLen; i) { --sCount[s.charAt(i) - a]; sCount[s.charAt(i pLen) - a]; if (Arrays.equals(sCount, pCount)) { ans.add(i 1); } } return ans; } }这里的难点是Arrays.equalsarr1,arr2方法我们指定equals默认底层是比较引用数据类型时只比较地址而Arrays中的equals方法是比较数组内容是否完全一致在这里可以用来检验字母异位词。方法一枚举public class Solution { public int subarraySum(int[] nums, int k) { int count 0; for (int start 0; start nums.length; start) { int sum 0; for (int end start; end 0; --end) { sum nums[end]; if (sum k) { count; } } } return count; } }方法二前缀和哈希表优化public class Solution { public int subarraySum(int[] nums, int k) { int count 0, pre 0; HashMap Integer, Integer mp new HashMap (); mp.put(0, 1); for (int i 0; i nums.length; i) { pre nums[i]; if (mp.containsKey(pre - k)) { count mp.get(pre - k); } mp.put(pre, mp.getOrDefault(pre, 0) 1); } return count; } }key:前缀和 value:该前缀和出现的次数