算法-子串

目录

和为 K 的子数组

想不到,前缀和相减能够获得所有子区间的和,然后使用hashmap记录前缀和,value记录当前和的个数。注意要用前缀和j-i时,需要j>i;前缀和本身也需要判断是否为K。

java 复制代码
public class 和为K的子数组 {
    class Solution {
        public int subarraySum(int[] nums, int k) {
            int res = 0;
            Map<Integer, Integer> map = new HashMap<Integer,Integer>();

            int[] s = new int[nums.length];
            s[0] = nums[0];
            if (nums[0]==k)res++;
            map.put(s[0],1);
            for (int i = 1; i < nums.length; i++) {
                s[i] = s[i-1] + nums[i];
                if (s[i]==k) res++;
                // s[i] - s[j] = k;
                if (map.containsKey(s[i]-k)) res+=map.get(s[i]-k);
                map.put(s[i],map.getOrDefault(s[i],0) + 1);
            }

            return res;
        }
    }
}

滑动窗口最大值

用ArrayDeque队尾作为栈,每次将元素入栈前将栈中小于该元素的数据出栈,从而保证该元素前面的元素滑出窗口后该元素就是最大值,队头记录了当前窗口内的最大值,需要在输出窗口最大值前将队列中不属于窗口内的值出队首,通过队列记录下标实现。

java 复制代码
public class 滑动窗口最大值 {
    class Solution {
        public int[] maxSlidingWindow(int[] nums, int k) {
            int[] res = new int[nums.length - k + 1];
            ArrayDeque<Integer> queue = new ArrayDeque<>();

            for (int i = 0; i < nums.length; i++) {
                // 出栈直到栈中数据都比nums[i]大
                while (!queue.isEmpty() && nums[i]>=nums[queue.peekLast()]){
                    queue.pollLast();
                }
                // 当前元素入栈
                queue.offerLast(i);
                // 队首元素即为最大元素
                if (i+1>=k){
                    // 先将不在窗口的元素出队
                    while (queue.peekFirst()<i+1-k) queue.pollFirst();

                    res[i+1-k] = nums[queue.peekFirst()];
                }
            }

            return res;
        }
    }
}

最小覆盖子串

如果窗口内不包含子串那么r右移,包含后l右移直到窗口内不包含子串。

相关推荐
天天摸鱼的java工程师4 分钟前
工作中 Java 程序员如何集成 AI?Spring AI、LangChain4j、JBoltAI 实战对比
java·后端
星辰_mya4 分钟前
RockerMQ之commitlog与consumequeue
java·开发语言
用户0203388613144 分钟前
红黑树主要功能实现
算法
__万波__5 分钟前
二十三种设计模式(二十二)--策略模式
java·设计模式·策略模式
不想上班的小吕6 分钟前
采购申请创建(BAPI_PR_CREATE/BAPI_REQUISITION_CREATE)
java·服务器·数据库
专注VB编程开发20年9 分钟前
压栈顺序是反向(从右往左)的,但正因为是反向压栈,所以第一个参数反而离栈顶(ESP)最近。
java·开发语言·算法
椰汁菠萝9 分钟前
spring boot下使用gdal解析tif文件
java·native·gdal·0
Xの哲學10 分钟前
Linux Select 工作原理深度剖析: 从设计思想到实现细节
linux·服务器·网络·算法·边缘计算
better_liang10 分钟前
每日Java面试场景题知识点之-ELK日志分析
java·elk·微服务·面试题·日志分析·企业级开发
图南随笔14 分钟前
Spring Boot(二十三):RedisTemplate的Set和Sorted Set类型操作
java·spring boot·redis·后端·缓存