构建前缀信息
| class NumArray { |
| public int[] prefixSum; |
| |
| public NumArray(int[] nums) { |
| prefixSum = new int[nums.length + 1]; |
| |
| for (int i = 1; i <= nums.length; i++) |
| prefixSum[i] = prefixSum[i - 1] + nums[i - 1]; |
| } |
| |
| public int sumRange(int left, int right) { |
| return prefixSum[right + 1] - prefixSum[left]; |
| } |
| |
| } |
- 构建前缀和最早出现的位置,返回无序数组中累加和为给定值的最长子数组的长度
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Scanner; |
| |
| class Main { |
| public static void main(String[] args) { |
| Scanner in = new Scanner(System.in); |
| int len = in.nextInt(); |
| int k = in.nextInt(); |
| int[] nums = new int[len]; |
| for (int i = 0; i < len; i++) { |
| nums[i] = in.nextInt(); |
| } |
| |
| int res = 0; |
| |
| int[] prefixSum = new int[len + 1]; |
| |
| Map<Integer, Integer> hashMap = new HashMap<>(); |
| |
| hashMap.put(0, 0); |
| for (int i = 1; i <= len; i++) { |
| prefixSum[i] = prefixSum[i - 1] + nums[i - 1]; |
| |
| if (hashMap.containsKey(prefixSum[i] - k)) |
| res = Math.max(res, i - hashMap.get(prefixSum[i] - k)); |
| |
| if (!hashMap.containsKey(prefixSum[i])) hashMap.put(prefixSum[i], i); |
| } |
| System.out.println(res); |
| } |
| } |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Scanner; |
| |
| class Main { |
| public static void main(String[] args) { |
| Scanner in = new Scanner(System.in); |
| int len = in.nextInt(); |
| int k = in.nextInt(); |
| int[] nums = new int[len]; |
| for (int i = 0; i < len; i++) { |
| nums[i] = in.nextInt(); |
| } |
| |
| int res = 0; |
| |
| int prefixSum = 0; |
| |
| Map<Integer, Integer> hashMap = new HashMap<>(); |
| hashMap.put(0, 0); |
| for (int i = 1; i <= len; i++) { |
| prefixSum += nums[i - 1]; |
| |
| if (hashMap.containsKey(prefixSum - k)) |
| res = Math.max(res, i - hashMap.get(prefixSum - k)); |
| |
| if (!hashMap.containsKey(prefixSum)) hashMap.put(prefixSum, i); |
| } |
| System.out.println(res); |
| } |
| } |
- 构建前缀和出现的次数,返回无序数组中累加和为给定值的子数组的个数
| import java.util.HashMap; |
| import java.util.Map; |
| |
| public class Solution { |
| public int subarraySum(int[] nums, int k) { |
| int res = 0; |
| |
| Map<Integer, Integer> map = new HashMap<>(); |
| |
| map.put(0, 1); |
| int prefixSum = 0; |
| for (int i = 1; i <= nums.length; i++) { |
| prefixSum += nums[i - 1]; |
| res += map.getOrDefault(prefixSum - k, 0); |
| |
| map.put(prefixSum, map.getOrDefault(prefixSum, 0) + 1); |
| } |
| return res; |
| } |
| |
| public static void main(String[] args) { |
| int[] nums = {1, 1, 1}; |
| System.out.println(new Solution().subarraySum(nums, 2)); |
| } |
| } |
- 构建前缀和最早出现的位置,返回无序数组中,正负数个数相等的最长子数组的长度
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Scanner; |
| |
| class Main { |
| public static void main(String[] args) { |
| Scanner in = new Scanner(System.in); |
| int len = in.nextInt(); |
| int[] nums = new int[len]; |
| for (int i = 0; i < len; i++) |
| nums[i] = in.nextInt(); |
| |
| int res = 0; |
| |
| int prefix = 0; |
| |
| Map<Integer, Integer> map = new HashMap<>(); |
| map.put(0, 0); |
| for (int i = 1; i <= len; i++) { |
| if (nums[i - 1] > 0) |
| prefix++; |
| else if (nums[i - 1] < 0) |
| prefix--; |
| if (map.containsKey(prefix)) |
| |
| res = Math.max(res, i - map.get(prefix)); |
| else |
| |
| map.put(prefix, i); |
| } |
| System.out.println(res); |
| } |
| } |
| import java.util.HashMap; |
| import java.util.Map; |
| import java.util.Scanner; |
| |
| class Main { |
| public static void main(String[] args) { |
| Scanner in = new Scanner(System.in); |
| int len = in.nextInt(); |
| int[] nums = new int[len]; |
| for (int i = 0; i < len; i++) { |
| int temp = in.nextInt(); |
| |
| nums[i] = temp != 0 ? (temp > 0 ? 1 : -1) : 0; |
| } |
| |
| int res = 0; |
| |
| int prefix = 0; |
| |
| Map<Integer, Integer> map = new HashMap<>(); |
| map.put(0, 0); |
| for (int i = 1; i <= len; i++) { |
| prefix += nums[i - 1]; |
| if (map.containsKey(prefix)) |
| |
| res = Math.max(res, i - map.get(prefix)); |
| else |
| |
| map.put(prefix, i); |
| } |
| System.out.println(res); |
| } |
| } |
- 构建前缀和最早出现的位置。表现良好的最长时间段问题
| import java.util.HashMap; |
| import java.util.Map; |
| |
| class Solution { |
| public int longestWPI(int[] hours) { |
| int res = 0; |
| |
| int prefix = 0; |
| |
| Map<Integer, Integer> map = new HashMap<>(); |
| map.put(0, 0); |
| for (int i = 1; i <= hours.length; i++) { |
| prefix += hours[i - 1] > 8 ? 1 : -1; |
| if (prefix > 0) { |
| |
| res = i; |
| } else { |
| |
| |
| if (map.containsKey(prefix - 1)) |
| res = Math.max(res, i - map.get(prefix - 1)); |
| } |
| if (!map.containsKey(prefix)) map.put(prefix, i); |
| } |
| |
| return res; |
| } |
| } |
- 构建前缀和余数最早出现的位置。移除的最短子数组长度,使得剩余元素的累加和能被p整除
| import java.util.HashMap; |
| import java.util.Map; |
| |
| class Solution { |
| public int minSubarray(int[] nums, int p) { |
| |
| int delete = 0; |
| for (int num : nums) delete = (delete + num) % p; |
| |
| |
| if (delete == 0) return 0; |
| |
| int res = 0x7fffffff; |
| |
| int prefixSum = 0; |
| |
| Map<Integer, Integer> map = new HashMap<>(); |
| map.put(0, 0); |
| for (int i = 1; i <= nums.length; i++) { |
| prefixSum = (prefixSum + nums[i - 1]) % p; |
| |
| |
| |
| int find = (prefixSum - delete + p) % p; |
| if (map.containsKey(find)) |
| res = Math.min(res, i - map.get(find)); |
| |
| map.put(prefixSum, i); |
| } |
| |
| return (res == 0x7fffffff || res == nums.length) ? -1 : res; |
| } |
| } |
- 构建前缀奇偶状态最早出现的位置。每个元音包含偶数次的最长子串长度
| import java.util.Arrays; |
| |
| class Solution { |
| public int findTheLongestSubstring(String s) { |
| int len = s.length(); |
| |
| int[] map = new int[32]; |
| |
| Arrays.fill(map, -2); |
| |
| map[0] = -1; |
| int ans = 0; |
| |
| int status = 0; |
| |
| int m; |
| for (int i = 0; i < len; i++) { |
| |
| m = move(s.charAt(i)); |
| |
| |
| if (m != -1) status ^= 1 << m; |
| if (map[status] != -2) { |
| |
| ans = Math.max(ans, i - map[status]); |
| } else { |
| |
| map[status] = i; |
| } |
| } |
| return ans; |
| } |
| |
| public static int move(char cha) { |
| switch (cha) { |
| case 'a': |
| return 0; |
| case 'e': |
| return 1; |
| case 'i': |
| return 2; |
| case 'o': |
| return 3; |
| case 'u': |
| return 4; |
| default: |
| return -1; |
| } |
| } |
| } |
本文作者:n1ce2cv
本文链接:https://www.cnblogs.com/sprinining/p/18011528
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步