当前位置: 首页 > news >正文

力扣8.29

76.最小覆盖子串

题目

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 ""

数据范围
  • m == s.length
  • n == t.length
  • 1 <= m, n <= 105
  • st 由英文字母组成
分析

滑动窗口,当我们第一次找到ts中的位置时,若长度为len,则后续的结果只需要考虑小于len的情况即可,设置一个长度为len的窗口,每次将窗口向右滑动,r指针为右边界,每次向右滑动一格,l指针为左边界,用于缩小滑动窗口,写一个check()函数判断窗口内的字符串是否包含t,若包含,则用l缩小窗口的即可。check()函数可以只使用一个map,在刚开始预处理t字符串的字符频数,s[l]t中则对应字符频数减1,若频数均<=0则说明包含t

代码
class Solution {
public:map<char, int> cnt;bool check() {for(auto [k, v] : cnt) {if(v > 0) return false;}return true;}void print() {for(auto [k, v] : cnt) {cout << k << " " << v << "  ";}cout << endl;}string minWindow(string s, string t) {if(s.size() < t.size()) return "";int l = 0, r = 0;for(int i = 0; i < t.size(); i ++ ) {cnt[t[i]] ++ ;}int len = 0x3f3f3f3f;int pos = -1;while(r < s.size()) {if(cnt.find(s[r]) != cnt.end()) {cnt[s[r]] -- ;}bool flag = check();while(check() && l <= r) {if(r - l + 1 < len) {len = r - l + 1;pos = l;}if(cnt.find(s[l]) != cnt.end()) cnt[s[l]] ++ ;l ++ ;}r ++ ;}if(pos == -1) return "";return s.substr(pos, len);}
};

15.三数之和

题目

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != kj != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

数据范围
  • 3 <= nums.length <= 3000
  • -105 <= nums[i] <= 105
分析

本题实际是两数之和的进阶版,最暴力的方法就是使用三重循环,复杂度为O(N^3),由于本题和两数之和有点关系,很容易可以发现后面的两重循环可以使用一个双指针算法进行简化,思路和两数之和一模一样。本题要求三元组不重复,思考一下什么情况会重复,双指针lr表示边界,举个例子-3、1、1、2,指针l遍历第一个1和第二个1都会产生相同的答案,若要消除这种情况,在遍历l时只要判断nums[l]nums[l-1]是否相同即可,若相同则上一次循环已经考虑过这种情况,直接continue,同时与这种情况对应的是遍历r时两个数相同,此时判断nums[r]nums[r+1]是否相同即可

代码
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> res;int n = nums.size();sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); i ++ ) {if(i && nums[i] == nums[i - 1]) continue;int l = i + 1, r = n - 1;while(l < r) {if(l > i + 1 && nums[l] == nums[l - 1]) {l ++ ;continue;}if(r < n - 1 && nums[r] == nums[r + 1]) {r -- ;continue;}int t = nums[l] + nums[r] + nums[i];if(t > 0) {r -- ;} else if(t < 0){l ++ ;} else {res.push_back({nums[i], nums[l], nums[r]});l ++ ;r -- ;}}}return res;}
};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • React多功能管理平台项目开发全教程
  • C++ | Leetcode C++题解之第387题字符串中的第一个唯一字符
  • Go入门:gin框架极速搭建图书管理系统
  • MySQL:复合查询
  • 深度学习(二)
  • minio最新源码编译(处理安全扫描中跨域访问、.js.map等不安全问题)
  • SQLite3 数据类型深入全面讲解
  • 【PyQt】切换界面的实现
  • day-45 全排列 II
  • 【机器学习】循环神经网络(RNN)介绍
  • MySQL集群技术4——MySQL路由
  • 【大模型】Reflextion解读
  • P01-何谓Java方法
  • Nginx: 使用KeepAlived配置实现虚IP在多服务器节点漂移及Nginx高可用原理
  • macos 10.15 Catalina 可用docker最新版本 Docker Desktop 4.15.0 (93002) 下载地址与安装方法
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 08.Android之View事件问题
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • codis proxy处理流程
  • mac修复ab及siege安装
  • Node + FFmpeg 实现Canvas动画导出视频
  • scrapy学习之路4(itemloder的使用)
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • vue总结
  • 从零开始的无人驾驶 1
  • 关于 Cirru Editor 存储格式
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 记一次和乔布斯合作最难忘的经历
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端攻城师
  • 什么是Javascript函数节流?
  • 温故知新之javascript面向对象
  • 2017年360最后一道编程题
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • (1) caustics\
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第5节(封闭类和Final方法)
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (二)丶RabbitMQ的六大核心
  • (附源码)计算机毕业设计ssm高校《大学语文》课程作业在线管理系统
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (十)T检验-第一部分
  • (四)软件性能测试
  • (一)为什么要选择C++
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • ****Linux下Mysql的安装和配置
  • ***详解账号泄露:全球约1亿用户已泄露
  • ./indexer: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object fil
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .form文件_SSM框架文件上传篇
  • .gitattributes 文件
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET开源纪元:穿越封闭的迷雾,拥抱开放的星辰
  • .NET实现之(自动更新)
  • .net项目IIS、VS 附加进程调试