hot100-一刷-04子串(共3道题)

news/2025/2/7 2:45:41/文章来源:https://www.cnblogs.com/chendsome/p/18584610

560. 和为 K 的子数组

题目链接

题目描述

image

代码实现

分析:

  • 暴力:还是有点技巧的,如果单纯暴力,外层fori循环遍历起始下标start,内层forj循环遍历末尾end,里面还需要个循环,计算从i加到j,最坏会到\(O(n^3)\)。考虑固定某一个边界,比如固定end,从end往前算。

    点击查看代码
    class Solution {public int subarraySum(int[] nums, int k) {int count = 0;for (int i = 0; i < nums.length; i ++){int sum = 0;for (int j = i ; j >= 0; j--) {// 暴力 从后累加, 可以用到前一次的累加结果,有点像dp背包内循环遍历顺序的讨论sum += nums[j];if (sum == k){count++;}}}return count;}
    }
    
  • 前缀和,类似1.两数之和

代码:

// 前缀和
class Solution {public int subarraySum(int[] nums, int k) {int count = 0;Map<Integer, Integer> map = new HashMap<>();int len = nums.length;int[] preSum = new int[len + 1];preSum[0] = 0;for (int i = 0; i < len; i++) {preSum[i + 1] = preSum[i] + nums[i];}for (int i = 0; i < nums.length; i++){// i 为0的时候, 就是计算 前缀子数组相加就是k的情况。// 前缀子数组的意思就是 从数组最开始到j的位置。[0,j]for(int j = i; j < nums.length; j++){// [i,j] 相加为kif(preSum[j+1] - preSum[i] == k){count++;}}}return count;}// 前缀和 + 哈希表 
class Solution {public int subarraySum(int[] nums, int k) {int count = 0;Map<Integer, Integer> map = new HashMap<>();int sum = 0;map.put(0,1); // 初始化前缀和为0的次数为1, 也是一样的到里,当前缀子数组和为k的时候,需要计数1次for (int i = 0; i < nums.length; i++){// 这里的i相当于是 前缀和 解法中的j, 是右边界,sum - (sum - k) == k, 只需要在遍历到sum的时候// 看看此时的sum-k里的个数就行,也就是[left, i]中left的个数,在遍历的过程中,map里记录了left的个数sum += nums[i];if (map.containsKey(sum - k)) {count += map.get(sum - k);}map.put(sum, map.getOrDefault(sum, 0) + 1);}return count;}
}

239. 滑动窗口最大值

题目链接

题目描述

image

代码实现

分析:

  • 使用一个单调队列完成,Deque来模拟单调队列。队列的顺序是从大到小。每次滑动窗口的过程可以分解为两个步骤:
    • 左边界元素移出:移出时只需要判断一下是否是当前队列前端元素(最大值),如果是就移出队列。不是就说明移除的元素不是当前窗口的最大值,不做操作。
    • 新增元素:新增元素时要判断加进来的元素与单调队列中的大小关系,按照约定的顺序,从队列尾部一个一个比较,队列尾部开始,比它小的元素都弹出,直到遇到大于等于这个新进来的元素时,加入队尾。

代码:

class Solution {public int[] maxSlidingWindow(int[] nums, int k) {Deque<Integer> stack = new LinkedList<>();int n = nums.length;// 初始化单调栈 栈头->栈底: 大->小  小的并不是完全不要,而是舍去比新加进来的元素小的元素for(int i = 0; i < k; i++){while(!stack.isEmpty() && nums[i] > stack.peekLast()){stack.pollLast();}stack.offerLast(nums[i]);}int[] res = new int[n-k+1];res[0] = stack.peekFirst();// 模拟滑动窗口for(int i = k; i < n; i++){// 窗口左边界:当前需要移除窗口的元素if(nums[i-k] == stack.peekFirst()){stack.pollFirst();}// 窗口右边新加进来的元素需要和栈内元素进行比较 这里不能用>=,因为可能有重复元素while(!stack.isEmpty() && nums[i] > stack.peekLast()){stack.pollLast();}stack.offerLast(nums[i]);res[i-k+1] = stack.peekFirst();}return res;}
}

76. 最小覆盖子串

题目链接

题目描述

image

代码实现

分析:

代码:


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846248.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JDBC链接数据库

1.首先我们需要下载mysql的官网jar包 https://dev.mysql.com/downloads/connector/j/ 这个版本比较新 然后打开idea 创建一个项目 下面是链接代码,记得看注释 package com.stu.jdbc;//我的包的名字叫com.stu.jdbc,报错可以删除 import java.sql.*; public class JDBC {//这个…

欧拉路/欧拉回路 学习笔记【未完工】

欧拉路判定 有向图 首先这张图将所有的有向边转为无向边之后图连通。 反例: 其次,我们知道当且仅当所有点的入度和出度都相等,才会有欧拉回路。因为一个点进去之后一定会出来,所以入度一定等于出度。 同理,我们也可以知道入度和出度差 \(1\) 时,才会有欧拉路。因为不要从…

XPT8871模块的使用

该模块引脚如下所示:由于XPT8871为单声道功放,因此只能连接1个喇叭。需要注意的是电源不能反接,否则会让芯片直接烧毁。另外该模块有个问题就是电流声很大,即使是5W的喇叭仍能听见较大的电流声。 但是该模块的价格还是蛮便宜的,只要1-2块钱就可以了。

JWT规范及使用

JWT结构 JWT由三部分组成:Header Payload SignatureJWT通常如下所示: xxxxx.yyyyy.zzzzz JWT结构部分说明 Header 报头通常由两部分组成:TOKEN的类型,即JWT,以及所使用的签名算法,如HMAC SHA256或RSA。 例如: { "alg": "HS256", "typ": &…

习题9.4

点击查看代码 import numpy as np import pandas as pd import scipy.stats as ss import statsmodels.api as sm data = np.loadtxt(F:\python数学建模与算法\源程序\《Python数学建模算法与应用》程序和数据\第9章 数据的描述性统计方法/ti9_4.txt) x1 = np.tile(np.arange(…

习题9.5

点击查看代码 import numpy as np import statsmodels.api as sm data = np.loadtxt(F:\python数学建模与算法\源程序\《Python数学建模算法与应用》程序和数据\第9章 数据的描述性统计方法/ti9_5.txt) x1 = np.vstack([np.ones((4, 4)), np.ones((4, 4))*2, np.ones((4, 4))*…

20222420 2021-2022-2 《网络与系统攻防技术》实验七实验报告

1.实验内容 1.1实验内容简述 本实践的目标为理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法。 (1)简单应用SET工具建立冒名网站 (2)ettercap DNS spoof (3)结合应用两种技术,用DNS spoof引导特定访问到冒名网站。 (4)提出具体防范方法 1.2近期学习内…

Ubuntu22.04 LTS 基于docker部署思源笔记

Ubuntu22.04 LTS 基于docker部署思源笔记 官网地址: https://b3log.org/siyuan/GitHub地址: https://github.com/siyuan-note/siyuan1. 启动docker容器 docker run -d \-v workspace_dir_host:workspace_dir_container \-p 6806:6806 \--restart always \b3log/siyuan \--wor…

如何提升日用品行业生产效率?

日用品生产中的协作效率低、任务分配不清、进度追踪困难、突发事件应对迟缓等问题普遍存在。数字化管理工具如Leangoo能提升协同与生产力。在日用品行业,快速反应和高效生产是生存之道。从采购、生产到物流配送,每一个环节都充满挑战。市场需求瞬息万变,交付周期日益缩短,任…

基于非线性预测和沿轨迹线性化MPC的车辆路径跟踪控制方法(2022年)

国自科/北大核心 华南理工大学、澳门大学 1.摘要 针对车辆路径跟踪模型预测控制(MPC)的动力学非线性问题和实时性要求,引入基于非线性预测和沿轨迹线性化的模型预测控制算法(MPC-NPLT),依据上一控制周期得到的控制序列预估系统未来的运动轨迹,将非线性因素从在线优化计…

Hume AI 语音控制功能:创建个性化语音;李飞飞空间智能首个模型:单图生成 3D 交互场景丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…