算法-子串

目录

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

相关推荐
星火开发设计2 小时前
枚举类 enum class:强类型枚举的优势
linux·开发语言·c++·学习·算法·知识
嘴贱欠吻!7 小时前
Flutter鸿蒙开发指南(七):轮播图搜索框和导航栏
算法·flutter·图搜索算法
徐徐同学7 小时前
cpolar为IT-Tools 解锁公网访问,远程开发再也不卡壳
java·开发语言·分布式
张祥6422889047 小时前
误差理论与测量平差基础笔记十
笔记·算法·机器学习
qq_192779878 小时前
C++模块化编程指南
开发语言·c++·算法
Mr.朱鹏8 小时前
Nginx路由转发案例实战
java·运维·spring boot·nginx·spring·intellij-idea·jetty
白露与泡影9 小时前
2026版Java架构师面试题及答案整理汇总
java·开发语言
cici1587410 小时前
大规模MIMO系统中Alamouti预编码的QPSK复用性能MATLAB仿真
算法·matlab·预编码算法
历程里程碑10 小时前
滑动窗口---- 无重复字符的最长子串
java·数据结构·c++·python·算法·leetcode·django
qq_2290580110 小时前
docker中检测进程的内存使用量
java·docker·容器