算法-子串

目录

和为 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右移直到窗口内不包含子串。

相关推荐
逸Y 仙X6 分钟前
文章三:Elasticsearch 集群恢复和索引分布
java·大数据·linux·服务器·elasticsearch·搜索引擎·全文检索
『昊纸』℃8 分钟前
《C语言电子新-2026最新版》-编程语言与程序
数据结构·算法·程序设计·编程语言·软件开发
奋斗的小乌龟7 小时前
动态创建Agent02
java
吃好睡好便好7 小时前
用while循环语句求和
开发语言·学习·算法·matlab·信息可视化
ZFSS7 小时前
Localization Translate API 集成与使用指南
java·服务器·数据库·人工智能·mysql·ai编程
摇滚侠7 小时前
Java 零基础全套教程,集合框架,笔记 153-163
java·开发语言·笔记
nannan12327 小时前
后端技术栈梳理
java
王璐WL8 小时前
【C语言入门级教学】函数的概念2
c语言·数据结构·算法
不知名的忻8 小时前
B 树与 B+ 树:面试完全指南
b树·算法·面试·b+树
L、2188 小时前
CANN算子开发调试实战:从“Segmentation Fault“到定位根因的完整流程
java·开发语言