Leetcode刷题笔记5
76. 最小覆盖子串
76. 最小覆盖子串 - 力扣(LeetCode)

解法一: 暴力枚举 + 哈希表
先定义left和right,可以在随机位置
枚举一个位置向后找,找到一个位置之后,发现这段区间是一个最小的区间之后,让left移动一格
然后right继续从left开始向后找
输入:s = "ADOBECODEBANC", t = "ABC"
hash1:
在t中A出现1次,B出现1次,C出现1次
hash2:
在s中,记录ABC出现几次
只要在hash2中,字符统计出现的次数大于等于hash1,那么就是一个有效的枚举
优化:
符合要求
s = "-----------------------------"
[L R]
当left向左移动一步时,会有两种情况
1:依旧符合要求
right不动
2:不符合要求
right向右移动,找符合要求的位置
两个指针是同向运动的,所以单调性,所以可以使用滑动窗口
解法二:滑动窗口 + 哈希表
s = "A D O B E C O D E B A N C", t = "ABC"
L
R
1. left = 0, right = 0
2. 进窗口 -> hash2[in]++
3. 判断,当窗口刚好合法时出窗口 -> check(hash1, hash2)
更新结果 -> 起始位置、最终的最短长度
出窗口 -> hash2(out)--
判断成立先更新结果,再出窗口然后继续判断
优化:判断条件
使用变量count标记有效字符的“种类”
1. 进窗口 -> 进之后,当hash2(in) == hash1(in), count++
只要hash2里面A的个数与hash1里面A的个数相等时统计
2. 出窗口 -> 出之前,当hash2(out) == hash1(out), count--
比如出窗口后,hash2里面A的个数从1变成了0,然后hash1里面A为1,成为了无效字符,那么count--
3. 判断条件 -> count == hash1.szie()
代码:C++
class Solution {
public:string minWindow(string s, string t) {// 数组模拟哈希表,因为全是英文字符int hash1[128] = {0}; // 统计字符串t中每个字符的频次int hash2[128] = {0}; // 统计窗口内每个字符的频次int kinds = 0; // 统计有效字符有多少种for(auto ch : t) {// if(hash[ch] == 0) kinds++;// hash[ch]++;// 同上if(hash1[ch]++ == 0) kinds++; // 加之前如果等于0,说明找到一个有效字符,所以kinds++}int minlen = INT_MAX, begin = -1; // minlen是最小覆盖子串长度,begin存的是起始位置for(int left=0, right=0, count=0; right<s.size(); right++){char in = s[right];// hash2[in]++;// if(hash2[in] == hash1[in])// {// count++;// }// 同上if(++hash2[in] == hash1[in]) count++; // 进窗口+维护count变量while(count == kinds) // 判断条件{// 只要窗口长度小于minlenif(right - left + 1 < minlen) // 更新结果{minlen = right - left + 1;begin = left;}// 出窗口char out = s[left++];// if(hash2[out] == hash1[out]) count--;// hash2[out]--;// 同上if(hash2[out]-- == hash1[out]) count--; // 说明此时有效字符的种类要减少}}if(begin == -1) return ""; // 如果等于-1说明没有找到一个子串,返回空串else return s.substr(begin, minlen); // 找到了就把它裁出来}
};
704. 二分查找
704. 二分查找 - 力扣(LeetCode)

原理:
[1, 2, 3, 4, 5, 6, 7, 8], t = 5
解法一:暴力解法 -> O(N)
从左往右依次用t跟数组的元素对比
比如选择4,那么在升序数组中,4和4左边区间的元素肯定比5小
解法二:二分查找算法“二段性”
当数组有二段性的时候就可以用二分查找算法
二段性:
当我们发现一个规律,然后根据这个规律选取某一个点后,能把这个数组分成两部分
然后根据规律可以有选择性的舍去一部分,然后根据这个规律在另一个部分里面继续查找的时候就可以用二分查找
选择中间点,时间复杂度最优
M
[ x ], t
L R
L = left, R = right, M = mid
朴素版本二分查找算法的核心:
第一种情况:x < t,删除左区间 -> left = mid + 1 -> 然后再在更新之后的[left, right]区间寻找结果
第二种情况:x > t,删除右区间 -> right = mid - 1 -> 然后再在更新之后的[left, right]区间寻找结果
第三种情况:x = t,直接返回结果
细节问题:
1. 循环结束的条件 -> left > right
2. 为什么是正确的
3. 时间复杂度
循环1次:
2次:
3次:
...
x次:1 -> ->
= n -> x = logN
代码实现:C++
class Solution {
public:int search(vector<int>& nums, int target) {int left = 0, right = nums.size() - 1;while(left <= right){// int mid = (left + right) / 2; // 有溢出风险int mid = left + (right - left)/2; // 防止溢出if(nums[mid] < target) left = mid + 1;else if(nums[mid] > target) right = mid - 1;else return mid;}return -1;}
};
二分查找的朴素版本模版:
// 朴素二分模版
// int left = 0, right = nums.size() - 1;while (left <= right){int mid = left + (right - left) / 2; if (......) left = mid + 1;else if (......) right = mid - 1;else return ......;}
JZ64 求1+2+3+...+n
求1+2+3+...+n_牛客题霸_牛客网 (nowcoder.com)

由于题目限制了常规的控制语句和条件判断,不能使用典型的循环或递归方法,我们需要找到一种绕开这些限制的方法来实现累加。
可以先定义一个类,在其构造函数中实现累加操作。
构造函数Sum():每次创建Sum类的对象时,构造函数会执行一次,将当前的i值加到sum中,并将i自增1
int i = 1; // 初始化一个全局变量 i,初始值为 1,从1开始累加
int sum = 0; class Sum {
public:Sum() {sum += i; // 在构造函数中,将当前的 i 值加到 sum 上++i; // 将 i 自增 1}
};
在主函数里面调用这个函数
class Solution {
public:int Sum_Solution(int n) {Sum a[n]; // 创建一个 Sum 类的对象数组 a,大小为 nreturn sum; // 返回全局变量 sum 的值}
};
每次创建Sum类的对象时,构造函数会自动执行累加操作。通过创建一个包含n个对象的数组,可以自动调用构造函数n次。
在C++中,创建一个类对象数组会自动调用数组中每个对象的构造函数。通过创建一个包含n个对象的数组,可以确保构造函数被调用n次,从而完成累加。
相关文章:
Leetcode刷题笔记5
76. 最小覆盖子串 76. 最小覆盖子串 - 力扣(LeetCode) 解法一: 暴力枚举 哈希表 先定义left和right,可以在随机位置 枚举一个位置向后找,找到一个位置之后,发现这段区间是一个最小的区间之后,…...
【Qt】Qt中的信号槽
一、信号和槽概述 信号槽是Qt矿建引以为豪的机制之一。 所谓信号槽,实际上就是观察者模式(发布——订阅模式)。当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号。这种发出的信号是…...
VsCode个人插件
Auto Rename Tag > 同时修改标签 Rainbow Brackets > 不同层级不同括号颜色 Dracula Official > 个人比较喜欢的一款主题 Error Lens > 错误信息显示 ES7REACT/Redux/React-Native>react开发插件 ESLINT Indenticator>方便看结构 Prettier Formatter …...
Docker环境安装并使用Elasticsearch
1、拉取es docker pull elasticsearch:7.10.12、查看镜像 docker images3、启动es docker run -d --name esearch -p 9200:9200 -p 9300:9300 elasticsearch:7.10.14、如果启动ES时出现一下问题 Unable to find image docker.elastic.co/elasticsearch/elasticsearch:7.10.…...
中心渗透Ⅱ
cs与msf权限传递以及mimikatz抓取win2012明文密码 使用Cobalt Strike抓取win2012明文密码,将会话传递到Metasploit Framework上 1.cs生成木马并使目标服务器中马 建立监听生成木马 2.抓取目标主机的明文密码 通过修改注册表来让Wdigest Auth保存明文口令 shell …...
【webrtc】RtpToNtpEstimator:最小二乘法、ntp估计及c++实例
上一篇: 【webrtc】RtpToNtpEstimator:将 RTP 时间戳映射到 NTP 时间 分析了最小二乘法的实现及对rtp到ntp的映射计算的调用流程 基于最小二乘法进行估计 RtpToNtpEstimator::Estimate G:\CDN\rtcCli\m98\src\system_wrappers\source\rtp_to_ntp_estimator.cc RtpToNtpEstima…...
【DevOps】Elasticsearch在Ubuntu 20.04上的安装与配置:详细指南
目录 一、ES 简介 1、核心概念 2、工作原理 3、 优势 二、ES 在 Ubuntu 20.04 上的安装 1、安装 Java 2、下载 ES 安装包 3、创建 ES 用户 4 、解压安装包 5、 配置 ES 6、 启动 ES 7、验证安装 三、ES 常用命令 1、创建索引 2、 插入文档 3、查询文档 四、ES…...
windows内存管理
一 windows系统的内存管理涉及哪些 1.1 虚拟内存管理机制 windows操作系统使用虚拟内存技术,将磁盘文件,通过映射对象(存储在物理内存)关联,映射到虚拟内存作为文件试图。即用户操作"虚拟内存中File View Objec…...
c++ 将指针转换为 void* 后,转换为怎么判断原指针类型?
当将指针转换为void后,擦除了指针所指向对象的类型信息,因此无法通过void指针来判断原始指针的类型。我这里有一套编程入门教程,不仅包含了详细的视频讲解,项目实战。如果你渴望学习编程,不妨点个关注,给个…...
Swift 属性
属性 一、存储属性1、常量结构体实例的存储属性2、延时加载存储属性3、存储属性和实例变量 二、计算属性1、简化 Setter 声明2、简化 Getter 声明3、只读计算属性 三、属性观察器四、属性包装器1、设置被包装属性的初始值2、从属性包装器中呈现一个值 五、全局变量和局部变量六…...
基于maxkey接入jeecgboot并实现账户同步
1. 注册应用 1.1 在统一认证中心注册第三方应用 1.1.1 填写应用名和登录地址 1.1.2 填写认证地址授权方式和作用域 1.1.3 选择权限范围并提交 1.2 配置访问权限 1.2.1 指定用户组 1.1.2 选择注册的应用 1.1.3 在单点登录认证页面查看添加的应用 1.3 同步一个第三方应用的账号…...
kafka Kerberos集群环境部署验证
背景 公司需要对kafka环境进行安全验证,目前考虑到的方案有Kerberos和SSL和SASL_SSL,最终考虑到安全和功能的丰富度,我们最终选择了SASL_SSL方案。处于知识积累的角度,记录一下kafka keberos安装部署的步骤。 机器规划 目前测试环境公搭建了三台kafka主机服务,现在将详细…...
[C++]debug介绍+debug时如何查看指针指向内存处的值
一、简介 预备工具和知识:使用使用VSCode使用Debug。 本文简介:本文将简要介绍debug中Continue,Step Over,Step Into和Restart的功能。并介绍如何在debug时查看动态内存地址(指针)的值; 二、D…...
AI学习指南数学工具篇-凸优化在支持逻辑回归中的应用
AI学习指南数学工具篇-凸优化在支持逻辑回归中的应用 一、引言 在人工智能领域,逻辑回归是一种常见的分类算法,它通过学习样本数据的特征和标签之间的关系,来进行分类预测。而在逻辑回归算法中,凸优化是一种重要的数学工具&…...
Flutter 中的 AspectRatio 小部件:全面指南
Flutter 中的 AspectRatio 小部件:全面指南 Flutter 是一个流行的跨平台 UI 框架,它提供了丰富的小部件来帮助开发者构建高质量的应用程序。在 Flutter 的小部件库中,AspectRatio 是一个非常有用的小部件,它允许开发者以一种简单…...
应用程序中的会话管理和Cookie安全指南
应用程序中的会话管理和Cookie安全指南 在现代应用程序中,会话管理和Cookie安全是确保用户信息和数据安全的重要组成部分。本文将详细介绍会话管理的最佳实践以及如何通过安全的Cookie设置来保护会话ID的交换。 单点登录(SSO)及会话管理机制…...
备战秋招c++ 【持续更新】
T1 牛牛的快递 原题链接:牛牛的快递_牛客题霸_牛客网 (nowcoder.com) 题目类型:模拟 审题&确定思路: 1、超过1kg和不足1kg有两种不同收费方案 ---- 起步价问题 2、超出部分不足1kg的按1kg计算 ----- 向上取整 3、向上取整的实现思路…...
整数拆分~
way:process //上一个拆出来的数是pre //还剩下rest需要去拆 //返回拆解的方法数 #include<iostream> using namespace std;//上一个拆出来的数是pre //还剩下rest需要去拆 //返回拆解的方法数 int process(int pre, int rest) {if(rest0) return 1;//因为后…...
【Qt Creator】跨平台的C++图形用户界面应用程序开发框架---QT
🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 1.互联网的核心岗位以及职…...
KingbaseES数据库物理备份还原sys_rman
数据库版本:KingbaseES V008R006C008B0014 简介 sys_rman 是 KingbaseES 数据库中重要的物理备份还原工具,支持不同类型的全量备份、差异备份、增量备份,保证数据库在遇到故障时及时使用 sys_rman 来恢复到数据库先前状态。 文章目录如下 1.…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
【HTML-16】深入理解HTML中的块元素与行内元素
HTML元素根据其显示特性可以分为两大类:块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...
