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

【Java算法】滑动窗口

  🔥个人主页: 中草药

🔥专栏:【算法工作坊】算法实战揭秘


👖一. 长度最小的子数组

题目链接:209.长度最小的子数组

算法原理

滑动窗口

滑动窗口算法常用于处理数组/字符串等序列问题,通过定义一个窗口(即一段连续的元素),并根据某种条件动态调整窗口的左右边界来找到满足条件的子序列。

在这个问题中,滑动窗口的具体应用如下:

  1. 初始化:设置两个指针 leftright,均初始化为0,表示窗口的左右边界。同时,初始化 sum 为0,用于累计窗口内元素的和,minlen 设置为 Integer.MAX_VALUE,用于记录符合条件的最小子数组长度。

  2. 扩展右边界:不断将右指针 right 向右移动,并将 nums[right] 加入到 sum 中,这相当于不断扩大窗口右侧,尝试包含更多的元素以满足和至少为 target 的条件。

  3. 收缩左边界:当窗口内的元素和 sum 至少达到 target 时,开始尝试缩小窗口左侧,即增加 left 指针的值,并从 sum 中减去移出窗口的元素 nums[left]。这个过程会持续进行,直到 sum 小于 target,确保每次收缩都检查当前窗口是否仍然满足条件。

  4. 更新最小长度:在每次收缩窗口后(即 sum 小于等于 target 时),用当前窗口的长度(right - left + 1)更新 minlen,保持记录最短的满足条件的子数组长度。

  5. 遍历结束:当右指针遍历完整个数组后,检查 minlen 是否仍为初始值 Integer.MAX_VALUE,如果是,则说明没有找到满足条件的子数组,返回0;否则返回 minlen 作为结果。

时间复杂度与空间复杂度

  • 时间复杂度:O(n),其中n为数组 nums 的长度。每个元素最多被访问两次,一次作为窗口扩展时加入,一次作为窗口收缩时移除。
  • 空间复杂度:O(1),只使用了固定数量的变量,与输入数组大小无关。

综上所述,这段代码利用滑动窗口算法高效地解决了寻找最小长度子数组使其和至少为目标值的问题。

代码

public int minSubArrayLen(int target, int[] nums) {int sum=0,minlen=Integer.MAX_VALUE;//无穷大for(int left=0,right=0;right<nums.length;right++){sum+=nums[right];//进窗口while(sum>=target){//出窗口minlen=Math.min(minlen,right-left+1);sum-=nums[left++];}}if(minlen==Integer.MAX_VALUE){return 0;}return minlen;}

举例

测试用例 [2,3,1,2,4,3]

初始状态

  • sum = 0
  • minlen = Integer.MAX_VALUE
  • 初始化双指针:left = 0right = 0

执行过程

第一轮迭代

  • right=0sum += nums[0] = 2, 现在 sum = 2, 不满足 sum >= targetright++
  • right=1sum += nums[1] = 3, 现在 sum = 5, 不满足 sum >= targetright++
  • right=2sum += nums[2] = 1, 现在 sum = 6, 不满足 sum >= targetright++
  • right=3sum += nums[3] = 2, 现在 sum = 8, 满足 sum >= target

这时进入内部的 while 循环。

第一次窗口收缩

  • sum >= target,计算子数组长度 right-left+1 = 4,更新 minlen = Math.min(minlen, 4) = 4
  • 从 sum 中减去 nums[left++] = nums[0] = 2,得到 sum = 6,继续在循环内检查。
  • 再次检查 sum >= target,是的,所以继续收缩。
  • 从 sum 中减去 nums[left++] = nums[1] = 3,得到 sum = 3,现在 sum < target,退出 while 循环。

接下来

  • 继续移动 right,累加 sum 直至再次满足条件或遍历完数组。

第二次满足条件

  • right=4sum += nums[4] = 4,现在 sum = 7,满足 sum >= target
  • 计算子数组长度 right-left+1 = 2,更新 minlen = Math.min(minlen, 2) = 2
  • 由于这次 sum 正好等于 target,收缩窗口会导致 sum < target,因此不会进一步收缩。

遍历完成

  • 继续移动 right,但不再有新的子数组满足条件且长度更小。

结果

遍历结束后,minlen = 2,这是满足条件的最小子数组长度,对应子数组是 [4,3]

🩰二.无重复字符的最长子串

题目链接:3.无重复字符的最长子串

算法原理

  1. 初始化:定义两个指针 leftright,初始都指向字符串的起始位置,即 left = 0right = 0hash 数组用于记录 ASCII 字符出现的次数(考虑到 ASCII 总共有 128 个字符,故数组大小为 128)。ret 用于存储最长无重复子串的长度,初始化为 0。

  2. 扩展右边界:不断地将右指针 right 向右移动,每移动一次,就将当前字符 ch[right]hash 数组中的计数加一。这意味着窗口正在尝试包含更多的字符。

  3. 处理重复字符与收缩左边界:如果 hash[ch[right]] 大于 1,表明当前字符 ch[right] 已经在窗口内出现过,这时需要移动左指针 left,将 left 指向的字符在 hash 中的计数减一,同时左指针右移一位,以此来排除重复字符,保证窗口内的字符都是唯一的。

  4. 更新最大长度:每次移动右指针时,都计算当前窗口的长度(即 right - left + 1),并将这个长度与当前已知的最大长度 ret 进行比较,取较大者更新 ret。这样可以保证 ret 始终保存着遇到过的最长无重复字符子串的长度。

  5. 遍历结束:当右指针 right 遍历到字符串末尾时,循环结束,返回 ret 作为最终结果。

时间复杂度与空间复杂度

  • 时间复杂度:O(n),其中 n 是字符串的长度。每个字符最多被访问两次,一次作为右边界扩展,一次作为左边界收缩。
  • 空间复杂度:O(1),虽然使用了 hash 数组,但它是一个固定大小的数组(128),与输入字符串的长度无关,因此空间复杂度是常数级别的。

总之,这段代码通过巧妙地利用滑动窗口和哈希表(在这里是简化版的数组实现)减少了不必要的字符比较,从而高效地求解了最长无重复字符子串的长度问题。

代码

 public int lengthOfLongestSubstring(String s) {int left=0,right=0;char[] ch=s.toCharArray();int[] hash=new int[128];//用数组模拟哈希表int ret=0;while(right<s.length()){hash[ch[right]]++;while(hash[ch[right]]>1){hash[ch[left++]]--;}ret =Math.max(ret,right-left+1);right++;}return ret;}

 举例

测试用例 "abcabcbb"

初始化

  • left = 0right = 0
  • char[] ch = {'a', 'b', 'c', 'a', 'b', 'c', 'b', 'b'}
  • int[] hash 初始化为全0,用于记录字符出现次数
  • ret = 0,用于记录最长无重复子串长度

执行过程

  1. 右指针移动 & 记录字符

    • right=0'a'hash['a'] = 1right++
    • right=1'b'hash['b'] = 1right++
    • right=2'c'hash['c'] = 1right++。此时,窗口abc无重复字符,ret = 3
  2. 发现重复,收缩左边界

    • right=3'a'hash['a'] = 2,发现重复,开始收缩左边界,hash['a']--left++
  3. 继续扩展与收缩

    • right=4'b'hash['b'] = 2,收缩左边界,hash['b']--left++
    • right=5'c'hash['c'] = 2,收缩左边界,hash['c']--left++。此时窗口内为bc,无重复字符,ret保持为3
  4. 重复与扩张

    • right=6'b'hash['b'] = 3,收缩左边界,hash['b']--left++
    • right=7'b'hash['b'] = 3,继续收缩左边界,hash['b']--left++。此时窗口为空,ret保持为3

结果

  • 最后,所有字符遍历完毕,返回 ret 的值,即最长无重复字符的子串长度为 3。在这段字符串中,满足条件的最长子串是 "abc"

这段代码通过动态调整窗口(由 leftright 定义)大小,有效利用哈希表(此处为简化版的 hash 数组)快速判断字符是否重复,最终找到了最长的无重复字符子串。

🎩三.最大连续1的个数III

题目链接:1004.最大连续1的个数III

算法原理

  1. 初始化:定义三个指针 left, right, 和一个计数器 zero,分别用来表示窗口的左边界、右边界以及窗口内 0 的数量。同时,定义 ret 来存储最长子数组的长度,初始化为 0。

  2. 扩展右边界:不断将右指针 right 向右移动,每次移动时检查新进入窗口的元素(nums[right])是否为 0,如果是,则将 zero 计数器加 1。这意味着窗口正在尝试包含更多的元素,包括 0。

  3. 处理限制条件:当窗口内 0 的数量超过了允许的最大数量 k 时,需要移动左指针 left 来缩小窗口,直到窗口内 0 的数量回到 k 或更少。在移动 left 的过程中,如果移出窗口的元素是 0,则将 zero 减 1。

  4. 更新最长子数组长度:在每次移动右指针之后(即每次尝试扩大窗口或维持窗口大小但可能更新了窗口内容后),都会用当前的右指针减去左指针再加 1 来计算当前窗口的长度,并用这个长度去更新 ret 的值,保持 ret 存储的是最长子数组的长度。

  5. 遍历结束:当右指针遍历完整个数组后,循环结束,此时 ret 中存储的就是满足条件的最长连续子数组的长度。

时间复杂度与空间复杂度

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。每个元素最多被遍历一次。
  • 空间复杂度:O(1),因为使用的变量数量是固定的,不依赖于输入数组的大小。

代码

public int longestOnes(int[] nums, int k) {int ret=0;for(int left=0,right=0,zero=0;right<nums.length;right++){if (nums[right]==0) zero++;while (zero>k){if (nums[left++]==0) zero--;}ret=Math.max(ret,right-left+1);}return ret;}

 举例

测试用例 [1,1,1,0,0,0,1,1,1,1,0]

初始化

  • left = 0right = 0zero = 0ret = 0

执行过程

  1. 右指针移动:初始化时数组内的前三个元素都是1,右指针向右移动,窗口内没有0,zero 仍为0,此时最长子数组长度为3,但随着右指针的移动,情况会变化。

  2. 遇到0并处理

    • 当 right = 3,遇到第一个0,zero = 1
    • 当 right = 4,遇到第二个0,zero = 2,达到了 k = 2 的限制。
    • 此时窗口 [1,1,1,0,0],满足条件,长度为5,更新 ret = 5
  3. 收缩左边界

    • 当 right = 5,遇到第三个0,由于 zero 已经是2,需要移动左指针。当 left = 3nums[left++] 是0,zero--,此时窗口内0的个数回到1,窗口变为 [1,0,0,1,0,0]
  4. 继续扩展右边界

    • 继续移动右指针,忽略更多的0,直到 right = 8,窗口为 [0,0,1,1,1,1,1,1],此时 zero = 2(最初的两个0),窗口长度为6,更新 ret = 6
  5. 之后的步骤

    • 当 right 继续移动并遇到更多0时,由于已经找到了长度为6且满足条件的子数组,即使右边界继续扩大,也不会影响最终答案,因为任何新加入的0都会导致左侧边界相应移动,保持最多2个0在窗口内。

结论

  • 最终返回 ret = 6,表示最长的连续子数组是 [0,0,1,1,1,1] 

🧢四.将x减到0的最小操作数

题目链接:11658.将x减到0的最小操作数

算法原理

  1. 计算总和:首先遍历数组 nums,计算其所有元素之和 sum。如果 sum 小于目标值 x,直接返回 -1,因为无论如何操作都无法使子数组之和等于 x

  2. 确定目标值:需要找到一个和为目标 x 的子数组,但实际操作中,我们是在找一个和为 target = sum - x 的子数组。这是因为我们需要从总和中减去 x 来达到操作的目的。

  3. 双指针滑动窗口

    • 初始化两个指针 left 和 right 都为 0,同时维护一个变量 cur 表示当前窗口内的元素和。
    • 右指针 right 向右移动,将 nums[right] 加入当前窗口的和 cur
    • 如果 cur 大于目标值 target,则说明当前窗口和过大,需要减小窗口左侧的值,即减去 nums[left] 并将 left 指针右移一位,同时更新 cur
    • 当 cur 等于 target 时,说明找到了一个符合条件的子数组。此时更新最大长度 ret 为当前子数组的长度(right-left+1)。
    • 继续移动右指针,重复上述过程,直到右指针遍历完整个数组。
  4. 结果处理

    • 如果在整个过程中没有找到符合条件的子数组(即 ret 仍为初始值 -1),返回 -1
    • 若找到了符合条件的子数组,返回数组长度减去找到的最长子数组长度,即 nums.length - ret。这代表需要的操作次数,因为要使得剩下的部分和为 x,整个数组的剩余部分(非连续子数组)需要通过减少操作来匹配。

时间复杂度与空间复杂度:

  • 时间复杂度:O(n),其中 n 是数组 nums 的长度。每个元素最多被访问两次,一次在计算总和时,一次在滑动窗口中。
  • 空间复杂度:O(1),使用的额外空间与输入数组的大小无关,只使用了几个固定变量。

代码

 public int minOperations(int[] nums, int x) {int sum=0;int ret=-1;for (int a : nums){sum+=a;}if(sum<x){return -1;}int target=sum-x;for (int left=0,right=0,cur=0;right<nums.length;right++){cur+=nums[right];while(cur>target){cur-=nums[left++];}if (cur==target){ret=Math.max(ret,right-left+1);}}if(ret==-1){return -1;}return nums.length-ret;}

举例

测试用例 nums=[1,1,4,2,3],x=5

初始化

  • 首先,遍历数组 nums 计算所有元素之和 sum

    • sum = 1 + 1 + 4 + 2 + 3 = 11
  • 检查 sum 是否小于 x,若小于则直接返回 -1,这里不适用,因为 11 >= 5

  • 计算目标和 targetsum - x

    • target = 11 - 5 = 6

滑动窗口

接下来,使用双指针(leftright)进行滑动窗口操作,同时维护窗口内元素和 cur

  1. 初始化left = 0, right = 0, cur = 0

  2. 遍历数组

    • 右指针移动right 开始从 0 向右移动,每次移动将 nums[right] 加入 cur
      • 当 right = 0cur = 0 + 1 = 1(此时 cur < target
      • 当 right = 1cur = 1 + 1 = 2(此时 cur < target
      • 当 right = 2cur = 2 + 4 = 6,此时 cur == target,记录子数组长度,ret = Math.max(ret, right-left+1) = Math.max(-1, 3) = 3,并且开始收缩窗口。
      • 由于 cur 等于 target,无需移动 left
  3. 继续移动右指针

    • 当 right = 3cur = 6 + 2 = 8(此时 cur > target),需要收缩窗口。
      • 移动 leftcur -= nums[left++] = 8 - 1 = 7left = 1,此时 cur > target 继续移动 left
      • 再次移动 leftcur -= nums[left++] = 7 - 1 = 6left = 2,此时 cur == target,不需要进一步移动 left
  4. 遍历结束

    • 右指针继续移动,但在本次测试用例中,不会再次找到满足条件的子数组,因此 ret 保持为 3

结果处理

  • 最后,检查 ret 是否为 -1,如果不是,则返回 nums.length - ret,因为这是从整个数组长度中减去满足条件的子数组长度,即需要操作的次数。
    • return nums.length - ret = 5 - 3 = 2

结论

对于测试用例 nums=[1,1,4,2,3]x=5,这段代码会返回 2,意味着需要至少操作两次,使得数组中某一段连续子数组之和等于 x=5。具体来说,可以通过减少前两个元素各一次(即 1-1=01-1=0),使得剩下的数组 [0,0,4,2,3]4+2=6 符合要求。


🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸

 

相关文章:

【Java算法】滑动窗口

&#x1f525;个人主页&#xff1a; 中草药 &#x1f525;专栏&#xff1a;【算法工作坊】算法实战揭秘 &#x1f456;一. 长度最小的子数组 题目链接&#xff1a;209.长度最小的子数组 算法原理 滑动窗口 滑动窗口算法常用于处理数组/字符串等序列问题&#xff0c;通过定义一…...

C# —— 属性和字段

属性和字段的区别 1.都是定义在一个类中&#xff0c;属于类成员变量 2.字段一般都是私有的private&#xff0c;属性一般是公开的Public 3.字段以小驼峰命名方式 age&#xff0c;属性一般是以大驼峰命名 Age 4.字段可以存储数据&#xff0c;属性不能存储数据&#xff0c;通过属性…...

【计算机视觉】人脸算法之图像处理基础知识(四)

图像的几何变换 图像的几何变换是指在不改变图像内容的前提下对图像的像素进行空间几何变换。主要包括图像的平移变换、镜像变换、缩放和旋转等。 1.插值算法 插值通常用来放缩图像大小&#xff0c;在图像处理中常见的插值算法有最邻近插值法、双线性插值法、二次立方、三次…...

探索 Spring Boot 集成缓存功能的最佳实践

在线工具站 推荐一个程序员在线工具站&#xff1a;程序员常用工具&#xff08;http://cxytools.com&#xff09;&#xff0c;有时间戳、JSON格式化、文本对比、HASH生成、UUID生成等常用工具&#xff0c;效率加倍嘎嘎好用。 程序员资料站 推荐一个程序员编程资料站&#xff1a;…...

微信小程序使用方法

一.在网页注册小程序账号&#xff08;在未注册的情况下&#xff09; 1.如果你还没有微信公众平台的账号&#xff0c;请先进入微信公众平台首页&#xff0c;点击 “立即注册” 按钮进行注册。我们选择 “小程序” 即可。 接着填写账号信息&#xff0c;需要注意的是&#xff0c;…...

前后端分离的后台管理系统源码,快速开发OA、CMS网站后台管理、毕业设计项目

那有没有一款软件解-决这种现状呢?答案是肯定的。引入我们的软件——eladmin。 介绍 ELADMIN,一个简单且易上手的 Spring boot 后台管理框架,已发布 Mybatis-Plus 版本,为开发者提供了一个全-面、高-效的解-决方案。 特点 高-效率:前后端完全分离,项目简单可配,内置代码…...

[深度学习]--分类问题的排查错误的流程

原因复现&#xff1a; 原生的.pt 好使&#xff0c; 转化后的 CoreML不好使&#xff0c; 分类有问题。 yolov8 格式的支持情况 Format Argument Suffix CPU GPU 0 PyTorch - .pt True True 1 Tor…...

微信小程序简易录音机

首先先创建一个项目&#xff08;想必大家都会啦那就直接开干&#xff09; 首先上html结构 <view class"wx-container"><view id"title">录音机</view><view id"time">{{hours}}:{{minute}}:{{second}}</view>&l…...

Ollama深度探索:AI大模型本地部署的全面教程

目录 引言一、Ollama概述1、定义与定位2、核心功能3、技术优势4、应用场景 二、安装与配置1、系统要求2、安装方法3、配置指南4、启动Ollama服务 四、快速开始1、启动Ollama2、部署运行模型3、REEST API 五、自定义模型1、定制化的必要性2、使用Modelfile定制模型3、参数调整4、…...

文心一言 VS 讯飞星火 VS chatgpt (285)-- 算法导论21.2 4题

四、请给出图 21-3 所示操作序列的一个运行时间的渐近紧确界&#xff0c;假定使用链表表示和加权合并启发式策略。如果要写代码&#xff0c;请用go语言。 文心一言&#xff1a; 图 21-3 没有直接给出&#xff0c;但通常这种操作序列可能与某种数据结构&#xff08;如并查集或…...

基于springboot实现影院订票系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现影院订票系统演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本影院订票系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在…...

Linux 常用命令合集

进入root模式 su -> 回车 -> 输入root用户密码关闭系统 方法1&#xff1a; shutdown -h now 方法2&#xff1a; init 0 方法3&#xff1a; telinit 0按预定时间关闭系统 shutdown -h hours:minutes &取消按预定时间关闭系统 shutdown -c重启 shutdown -r now重启…...

Vue3插件安装

一、volar插件安装 volar&#xff1a;Vue文件的语法提示和高亮提醒。volar已经更名为Vue - Official&#xff0c;其安装步骤如下。 (1)打开vscode&#xff0c;点击扩展面板&#xff0c;在搜索窗口中输入volar&#xff0c;选择Vue - Official进行安装。 &#xff08;2&#xff0…...

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 缓存穿透 【针对大量非法访问的请求&#xff0c;缓存中没有&#xff0c;直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据&#xff0c;这样每次请求直接打到数据库&#xff0c;就好像缓存不存在 一样。 对于系…...

国产24位I2S输入+192kHz立体声DAC音频数模转换器CJC4344

CJC4344是一款立体声数模转换芯片&#xff0c;内含插值滤波器、multi bit数模转换器、输出模拟滤波器。CJC4344系列支持大部分的音频数据格式。CJC4344基于一个带线性模拟低通滤波器的四阶multi-bitΔ-Σ调制器&#xff0c;而且本芯片可以通过检测信号频率和主时钟频率&#xf…...

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤&#xff1a; 2. 注册微信开发者账号步骤&#xff1a; 3. 创建 UniApp 项目步骤&#xff1a; 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…...

[WTL/Win32]_[中级]_[MVP架构在实际项目中的应用]

场景 在开发Windows和macOS的界面软件时&#xff0c;Windows用的是WTL/Win32技术&#xff0c;而macOS用的是Cocoa技术。而两种技术的本地语言一个主打是C,另一个却是Object-c。界面软件的源码随着项目功能增多而增多&#xff0c;这就会给同步Windows和macOS的功能造成很大负担…...

《Windows API每日一练》5.2 按键消息

上一节中我们得知&#xff0c;Windows系统的按键消息有很多类型&#xff0c;大部分按键消息都是由Windows系统的默认窗口过程处理的&#xff0c;我们自己只需要处理少数几个按键消息。这一节我们将详细讲述Windows系统的所有按键消息及其处理方式。 本节必须掌握的知识点&…...

adb 截屏和录屏命令

adb 录屏命令 screenrecord 简介 screenrecord 是一个 shell 命令 支持 Android 4.4(API level 19)以上 支持视频格式: mp4 一些限制 某些设备可能无法直接录制,原因是分辨率太高,如果遇到此类问题&#xff0c;请试着指定较低的分辨率 不支持录制过程中屏幕旋转,如果录制…...

springboot相关的一些知识

SpringBoot可以同时处理多少请求 SpringBoot默认的内嵌容器是Tomcat&#xff0c;所以SpringBoot可以同时处理多少请求取决于Tomcat。 SpringBoot中处理请求数量相关的参数有四个&#xff1a; server.tomcat.thread.min-spare&#xff1a;最少的工作线程数&#xff0c;默认大小…...

DP:完全背包+多重背包问题

完全背包和01背包的区别就是&#xff1a;可以多次选 一、完全背包&#xff08;模版&#xff09; 【模板】完全背包_牛客题霸_牛客网 #include <iostream> #include<string.h> using namespace std; const int N1001; int n,V,w[N],v[N],dp[N][N]; //dp[i][j]表示…...

购物返利系统的安全性:防范欺诈与数据保护

购物返利系统的安全性&#xff1a;防范欺诈与数据保护 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 购物返利系统作为一种电子商务模式&#xff0c;通过向消…...

从WebM到MP3:利用Python和wxPython提取音乐的魔法

前言 有没有遇到过这样的问题&#xff1a;你有一个包含多首歌曲的WebM视频文件&#xff0c;但你只想提取其中的每一首歌曲&#xff0c;并将它们保存为单独的MP3文件&#xff1f;这听起来可能有些复杂&#xff0c;但借助Python和几个强大的库&#xff0c;这个任务变得异常简单。…...

图片转pdf,图片转pdf在线转换,在线图片转pdf

图片转PDF&#xff0c;听起来似乎是一个简单的操作&#xff0c;但实际上&#xff0c;它涉及到许多细节和技巧。有时候我们需要将图片转换为PDF格式&#xff0c;以便于分享、打印或保存。那么&#xff0c;如何将图片转换成PDF呢&#xff1f;接下来&#xff0c;我将为您详细介绍几…...

SpringBoot3使用Swagger3

SpringBoot3使用Swagger3 项目中的后端接口进行简单的前端展示一、依赖引入二、快速启动1.在application.yml中配置2.或者properties文件,则配置3.启动项目访问swagger 三、使用注解标注接口Swagger配置文件Swagger 注解迁移举例五种常用ApiApiOperationApiImplicitParamApiMod…...

【51单片机基础教程】点亮led

文章目录 前言51单片机点亮LED的原理硬件部分软件部分51单片机的寄存器编程步骤proteus仿真点亮一个led 点亮多个ledproteus仿真代码 流水灯 总结 前言 单片机&#xff08;Microcontroller Unit, MCU&#xff09;是一种集成电路&#xff0c;广泛应用于各种电子产品中。作为嵌入…...

Docker之overlay2的迁移

原因 docker默认将文件及其容器放置在了系统盘的挂载区内&#xff0c;如果长期使用会发现系统挂载区被overlay2挤爆了,因此在一开始我们将其迁移在大容量外挂磁盘上,就可以避免系统盘被挤爆,放心使用. 具体操作 # 停止容器 systemctl stop docker# 修改容器配置&#xff0c…...

CentOS中的rename命令

目录 CentOS中的rename命令基本语法使用示例注意事项安装prename CentOS中的rename命令 在CentOS系统中&#xff0c;rename命令通常是指util-linux包中提供的版本&#xff0c;它用于批量重命名文件&#xff0c;但与Perl版本的rename命令相比&#xff0c;功能较为简单&#xff…...

redis.conf 参数详解,方便进行性能优化配置

以下是redis.conf中一些常见参数的详细说明&#xff1a; daemonize&#xff1a;是否以后台进程运行&#xff0c;默认为no&#xff1b; pidfile&#xff1a;如以后台进程运行&#xff0c;则需指定一个pid&#xff0c;默认为/var/run/redis.pid&#xff1b;bind&#xff1a;绑定主…...

微信小程序登录流程详情及Java代码

一、流程图 说明&#xff1a; 调用 wx.login() 获取 临时登录凭证code &#xff0c;并回传到开发者服务器。 调用 auth.code2Session 接口&#xff0c;换取 用户唯一标识 OpenID 和 会话密钥 session_key。 获取手机号&#xff0c;调用wx.getPhoneNumber() &#xff0c;获取加密…...

php企业网站demo/2024年新闻摘抄十条

酷派5891Q的usb驱动有没有人需要的&#xff0c;和其它的酷派手机是一样的&#xff0c;因为手机在用数据线连接电脑的时候都是需要驱动的&#xff0c;说的这个驱动是安装在电脑上&#xff0c;很多人下载下来驱动之后不知道怎么进行安装&#xff0c;如果没有驱动的话&#xff0c;…...

达内网站开发学习培训/seo公司品牌哪家好

PROKLETNIK 题目描述&#xff1a;给出\(n\)个数&#xff0c;定义一段连续的数为魔法串是该区间的左右端点值正好是区间的最小值与最大值&#xff08;最小值可以在左也可以在右&#xff0c;最大值也一样&#xff09;。\(Q\)个询问&#xff0c;每次询问一个区间\([L, R]\),问该区…...

网站套餐到期是什么意思/网站推广方案策划书2000

...

国家卫健委信息查询/现在的seo1发布页在哪里

我是勤劳的搬运工……源码装了好多次Mysql&#xff0c;终于成功了…… 1.下载源码安装包 因为安装mysql需要对应的boost文件&#xff08;必须是相应版本&#xff0c;不能高也不能低&#xff09;&#xff0c;所以&#xff0c;为了不再麻烦的搜索对应的boost文件&#xff0c;下载…...

华为网站搭建/电商运营推广的方式和渠道有哪些

传送门 很明显题目要求的东西可以写成$\sum_{i1}^{n}\sum_{j1}^m gcd(i,j)*2-1$&#xff08;一点都不明显&#xff09; 如果直接枚举肯定爆炸 那么我们设$f[i]$表示存在公因数$i$的数的对数 然而$i$并不一定是这几对数的最大公因数 那么怎么办呢&#xff1f;考虑容斥 以$i$为最…...

雄安智能网站建设电话/企业宣传片

位运算符&#xff08;内存中的位数进行操作&#xff0c;二进制比特位比一般语法乘2要快一些&#xff09;&#xff1a;优化我们的算法&#xff0c;提高我们的效率。 位于&#xff1a;& 位或&#xff1a;| 异或&#xff1a;^ 相异得1&#xff0c;相同得0 位非&#xff1a;~ …...