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

Daily算法刷题【面试经典150题-2️⃣】

文章目录

  • ⚡️滑动窗口
    • 1.长度最小的子数组
    • 2.无重复字符的最长子串

⚡️滑动窗口

1.长度最小的子数组

在这里插入图片描述

🎈法1:暴力枚举
TLE

/*
时间复杂度:O(n2)
空间复杂度:O(1)
*/
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int ans = INT_MAX;long sum = 0;int n = nums.size();for(int i = 0; i < n; i++){sum = 0;for(int j = i; j < n; j++){sum += (long)nums[j];if(sum >= target){ans = min(ans, j - i + 1);break; //!!!找到最近的就break}}}return ans == INT_MAX ? 0 : ans;}
};

🎈法2:滑动窗口
定义两个指针 l 和 r 分别表示子数组(滑动窗口窗口)的开始位置和结束位置
里面数的和就是就是要求的子数组的和

/*
时间复杂度:O(n)
空间复杂度:O(1)
*/
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {long sum = 0;int n = nums.size();for(int i = 0; i < n; i++){sum += (long)nums[i];}if(sum < target) return 0;int l = 0,r = 0;int cur = 0;int ans = INT_MAX;while(r < n){cur += nums[r];while(cur >= target){ans = min(r - l + 1, ans);cur -= nums[l];l++;}r++;}return ans;}
};

🎈法3:前缀和 + 二分
其实就是把暴力的o(n2)优化掉一个为o(nlogn),再确定完子数组的开始后,查找结束r需要o(n),我们采用二分查找这个满足的最小的r,因为数组中所有数都是大于0的,所以前缀和是单调的,因此可以利用前缀和

class Solution {
public:int minSubArrayLen(int s, vector<int>& nums) {int n = nums.size();if (n == 0) {return 0;}vector<int> sums(n+1, 0);for(int i = 1; i <= n; i++){sums[i] = sums[i - 1] + nums[i - 1];}int ans = INT_MAX;for (int i = 0; i < n; i++) {int l = i + 1, r = n, pos = -1;while (l <= r) {int mid = (l + r) >> 1;if (sums[mid] - sums[i] >= s) {pos = mid;r = mid - 1; // 继续向左收缩} else {l = mid + 1;}}if(pos != -1) ans = min(ans,pos - i);}return ans == INT_MAX ? 0 : ans;}
};

2.无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长 子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。

🎈法1:滑动窗口
维护一个窗口,使里面的数据始终满足要求,一般来说就是用l,r分别表示区间的起点和终点,r一直往后窗口不断增大,当不满足条件时l++,窗口缩小
在这里插入图片描述
当l=0,r=3时,a重复,此时就应该l++,从窗口中取出重复的a

/*时间复杂度:O(n)
*/
class Solution {
public:int lengthOfLongestSubstring(string s) {int n = s.size();unordered_set<char> set;int l = 0, r = 0;int ans = 0;while(r < n){// 去重while(set.find(s[r])!=set.end()){set.erase(s[l]);l++;}ans = max(ans, r - l + 1);set.insert(s[r]);r++;}return ans;}
};

文章转载自:

http://isTxtsG3.prkdL.cn
http://HDkySem5.prkdL.cn
http://otHPnEMy.prkdL.cn
http://mwwtPljE.prkdL.cn
http://alx2m3ID.prkdL.cn
http://c5cpSRmD.prkdL.cn
http://K148166s.prkdL.cn
http://Cv9RiuaI.prkdL.cn
http://KVgCVVUg.prkdL.cn
http://2SNVuTpa.prkdL.cn
http://xwTrVIdq.prkdL.cn
http://tYrcpjV0.prkdL.cn
http://wQvmyT7u.prkdL.cn
http://CKXzqeFN.prkdL.cn
http://MrCcFHBZ.prkdL.cn
http://ZDgKzb4R.prkdL.cn
http://LoESxPd5.prkdL.cn
http://nLzcXKZu.prkdL.cn
http://st7B9gCJ.prkdL.cn
http://AzrH2vgA.prkdL.cn
http://2oAH9fWH.prkdL.cn
http://UDgG8817.prkdL.cn
http://kh8ZLSOe.prkdL.cn
http://o4r4Y3e3.prkdL.cn
http://eOMlkQaC.prkdL.cn
http://EGBFRQPq.prkdL.cn
http://dzrnhQGX.prkdL.cn
http://8d8nqA1N.prkdL.cn
http://Q25K7b4y.prkdL.cn
http://MfJ3NIFc.prkdL.cn
http://www.dtcms.com/a/372622.html

相关文章:

  • Ucloud技术支持问题
  • 调试 cuda kernel
  • OpenLayers常用控件 -- 章节九:比例尺控件教程
  • 李沐深度学习论文精读(一)AlexNet + ResNet
  • CMake构建C++项目,报错“CMake Error CMAKE_C_COMPILER not set, after EnableLanguage”
  • 2025最新超详细FreeRTOS入门教程:第五章 FreeRTOS信号量
  • 安卓逆向(二)相关问题及解决方案
  • 自学嵌入式第37天:MQTT协议
  • daily notes[11]
  • Qt中QProxyStyledrawControl函数4个参数的意义
  • AutoHotkey识别图片
  • 【数学建模】在烟雾导弹遮蔽模型中的实际参考文献
  • 快速了解word2vec模型
  • 关于高并发的一连串问题分析(未完成)
  • Ansible Playbook 核心配置实操指南:主机清单引用、并行执行与模块化组织
  • 2025年金融专业人士职业认证发展路径分析
  • NVM 使用指南(Node Version Manager)
  • 2025年体制内职业发展相关认证选择指南
  • 电脑提速之关于Edge优化
  • 图像纹理相似度评价——Gabor变换
  • [光学原理与应用-463]:波动光学 - AOM的0级光与1级光
  • SpringBoot 公共字段自动填充
  • 《计算》第一二章读书笔记
  • 多模态大模型---第1节
  • 删除字符串中的空格
  • STM32 开发(三十三)STM32F103 片内资源 —— 直接存储 DMA 实战 编码详解
  • MGSM:大模型多语言数学推理的“试金石”
  • 卫星直连服务:从稀疏星座到全球覆盖的未来通信革命
  • FastAPI:像搭建餐厅一样设计API
  • 基于CNN-SE Attention和SHAP可解释性分析的故障诊断matlab