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

leetcode - 双指针问题

文章目录

前言

题1 移动零:

思路:

参考代码:

题2 复写零:

思考:

参考代码:

题3 快乐数:

思考:

参考代码:

题4 盛最多水的容器:

思考:

参考代码:

题5 有效三角形的个数:

思考:

参考代码:

题6 查找总价格为目标值的两个商品:

思考:

参考代码:

题7 三数之和:

思考:

参考代码:

题8 四数之和:

总结


前言

路漫漫其修远兮,吾将上下而求索;


题1 移动零:

283. 移动零 - 力扣(LeetCode)

提取题干意思:

思路:

数组划分类题型(数组分块):给了我们一个数组,并且制定了一个规则,让我们在这个规则下将该数值划分为若干个区间

本题:

利用双指针,指针cur 从左往右遍历扫描数组,指针dest指向已处理区域非零元素最后一个位置,图解如下:

相当于指针cur、dest 将数据划分为了三段:[0,dest] 为非0的数据区域、[dest+1 , cur-1] 为0的数据区域,[cur,n-1] 为待扫描的数据区域(其中n表示数据个数)

流程:eg. nums = [0,1,0,3,12]

思路总结:

注:双指针思想是快排中最核心的思想;虽可以解决快排问题,但是当数据量特别大的时候(例如相同的数据很多时),该方法的时间复杂度就接近N^2,因此快排不能解决比较恶心的数据(重复的数据多);

参考代码:

    void moveZeroes(vector<int>& nums) {int n = nums.size();int cur = 0, dest = -1;while(cur<n){if(nums[cur]){++dest;swap(nums[dest] , nums[cur]);}cur++;}}

优化 - cur 的遍历可以使用范围for,代码如下:

    void moveZeroes(vector<int>& nums) {int cur = 0;for(auto& e:nums){if(e) {swap(e , nums[cur]);cur++;}}}

题2 复写零:

​​​​​​1089. 复写零 - 力扣(LeetCode)

提取题干意思:

思考:

我们先思考一下,异地操作(借助于其他空间)如何实现:

需要一个指针cur在旧数组上遍历,一个指针dest在新数组上遍历,当cur 遇到了0 就让dest 写两个0,cur 遇到非0,就让dest 写这个数据;图解如下:

Q1:是否可以从左往右直接使用双指针?

  • 本题不行,因为遇见0要在原数组上写两个0,会覆盖掉后面的数据;但是如果是删除值为val 的题,就可以这么做;

Q2:既然从左往右不可行,那么从右往左是否可行呢?

从右往左的话,就需要找到cur 最后一个所要“复写”的位置,如何找?

  • 这与整个数组中0的个数有关系,可以先利用双指针(cur,dest)从左往右遍历(cur遇到0,dest走两步,非0dest走一步;当cur 走到最后一个数据或者dest 走到最后一个的时候,cur 指向的位置就是最后一个所要“复写”的位置),找到最后一个所要复写的位置,然后此时cur 、dest 的位置就是从右往左复写数据时的位置,思路图如下:

注:dest 指向有效数据的结尾,初始化为-1;cur 初始化为0;

但是,如果当cur 指向0,而dest 往后走两步可能就会越界,如果dest 越界了;而此时cur 、dest 的位置会作为从右往左复写数据时的位置,但是dest 已经越界了,故而这是有问题的;

解决方法:在找位置结束后判断dest 是否合法(dest小于等于n-1就是合法的范围 ,但是dest 如果越界是一定等于n);如果合法什么都不做,如果不合法,dest = n-1 ,cur--;arr[n-1] = 0,如下图:

即,在找最后一个所要复写的位置的时候,有三种情况回导致循环结束

参考代码:

    void duplicateZeros(vector<int>& arr){int n = arr.size();int cur = 0, dest = -1;//先从左往右遍历,找到cur 指向的最后一个数据while(cur<n){if(arr[cur]==0) dest+=2;else ++dest;//在此过程中dest 可能会越界//在cur 自增前判断dest 是否越界if(dest >= n-1) break;//因为n-1 是最后一个有效位置 cur++;}//边界情况处理,dest 越界了一定是为nif(dest==n){arr[n-1] = 0;dest-=2;--cur;}//从先有的cur dest 的位置进行复写操作while(cur>=0){if(arr[cur]==0){arr[dest--] = 0;arr[dest--] = 0;}else{arr[dest--] = arr[cur];}cur--;}}

题3 快乐数:

202. 快乐数 - 力扣(LeetCode)

提取题干意思:

思考:

根据例子,画图思考:eg. 19 、2

对于19,最后得到是1在循环,故而返回的是true;对于2,最后得到的不是1的循环,所以返回false;

要么最后是1,陷入1的循环;要么不是1但是最后陷入一个循环之中

图解是否感觉有点熟悉?是不是有一点像链表,如果转换成链表,就是判断这链表环中的值即可(因为一旦有1,就一定是1为一个单独的循环);而在链表 - 判断链表是否有环,是用快慢双指针来解决;

可以将本题抽象成链表,一个数变化成一个数可以抽象成这些数串联了起来;并且在本题中不用判断是否有环,只需要判断环中的值便可;

需要注意的是,slow 初始化为第一个数据的位置,fast 初始化为slow 的下一个位置;

只需要判断这两个值相遇的值是不是1即可,是1就返回true ,不是1则返回false;

在这个过程中是一定成环的;

注:

1、在带环的链表中,快慢双指针一定会相遇,并且一定会在环中相遇;

2、本题中虽然不像链表中是一个一个结点,只是一个一个的数 , 我们也可以让数来充当“指针”;不要被指针这个词限制了思维,此处所讲的指针并不是真正的指针,而是在数组中使用双指针的时候可以用数组下标来充当指针,因此“双指针”只是一种思想;

本题题干中:,所以就一定回成环,但是如果题干如果没有给这个提示呢?

那么分析地时候,就会分析出第三种情况:变下去不会成环;存在不成环的情况吗?如果题干没有这个提示,我们又该如何解决?

证明:为什么在变化的过程中一定会有环?

我们先来了解一个原理:鸽巢原理(抽屉原理)

注:我们的证明会用到鸽巢原理

取 9999999999 是因为它是 2.1*10^9 同样位数中的最大的数,可以靠它看一下范围;

对于 9999999999 来说,经过“操作”它每一位的和为 9^2*10 = 810,也就是9999999999经过“操作”之后所能变成的最大的数,即对于 9999999999 来说有810 个巢,而 2.1*10^9 小于9999999999,那么  2.1*10^9 经过操作之后的结果一定小于等于9999999999 经过“操作”之后的结果810,即2.1*10^9 的巢得个数一定小于等于810并且大于等于1;

2.1*10^9 的巢得个数:[1,810]

那么一个数如果进行了“操作”大于810 次(操作次数是无限的),必定就会循环,即该数一定成环;(即将大于810 的鸽子放到810 个巢里面,必定有一个巢中的鸽子数量大于1)就可以证明没有第三种情况:变下去不会成环;

经过上述证明,数据在变化的过程中一定会成环;

参考代码:

    //获取一个数的每一个位置上的平方和int getbit(int n){int tmp = n, sum  = 0;while(tmp){int t  = tmp%10;//每一位sum += t*t;//平方和tmp/=10;//迭代}return sum;}bool isHappy(int n) {//通过鸽巢原理可以证明一定成环,所以可以利用快慢双指针来解决这个问题//注意slow 与 fast 的初始化!int slow = n , fast = getbit(n);//当slow 与 fast 相遇的时候,一定在环中相遇,此时只需要判断相遇的值便可while(slow!=fast){//slow 一次走一步//fast 一次走两部slow = getbit(slow);fast = getbit(fast);fast = getbit(fast);}if(slow == 1) return true;else return false;}

可以优化一下上面的参考代码,优化代码如下:

    //获取一个数的每一个位置上的平方和int getbit(int n){int tmp = n, sum  = 0;while(tmp){int t  = tmp%10;//每一位sum += t*t;//平方和tmp/=10;//迭代}return sum;}bool isHappy(int n) {//通过鸽巢原理可以证明一定成环,所以可以利用快慢双指针来解决这个问题//注意slow 与 fast 的初始化!int slow = n , fast = getbit(n);//当slow 与 fast 相遇的时候,一定在环中相遇,此时只需要判断相遇的值便可while(slow!=fast){//slow 一次走一步//fast 一次走两部slow = getbit(slow);fast = getbit(getbit(fast));}return slow==1;}

题4 盛最多水的容器:

11. 盛最多水的容器 - 力扣(LeetCode)

数据范围:

例子:

思考:

解法一:暴力解法

将所有两两组合的情况均列举出来,找到其中的最大值即可;此处的数据量约有 10万,使用暴力解法的时间复杂度为 O(N^2) ,一定会超时的,不过此处我们还是尝试一下用暴力解法是否能过:

测试用例能通过,但是提交之后:

解法二:利用单调性使用双指针

为什么会想到用单调性?

  • 如果想要找到两数相乘再乘以其底面积的最大值,一定是从左边区域中找一个最大的乘以右边区域中最大的数;使用双指针一个从左边开始,一个从右边开始,谁小谁就往自己所在的方向移动;而如果有一个木桶,它的板高度不一样,它所能所能存多少水是由最短的板决定的,所以我们该用短板才会有效果,而桶底也是变化的,所以还需要一个变量来记录体积;

例子:

思路总结:定义两个指针left right ,根据这两个指针指向的数据,记录计算出来的体积,谁小谁移动,循环下去更新得到的最大值;循环条件:left<right;

参考代码:
 

    int maxArea(vector<int>& height) {//体积由短板决定int left = 0 , right = height.size()-1 ,ret = INT_MIN;while(left<right){//体积 = 短板长度*底面积int v = (height[left]<height[right]?height[left] : height[right]) * (right-left);ret = max(ret , v);//谁小谁移动if(height[left]>height[right]) right--;else left++;}return ret;}

题5 有效三角形的个数:

611. 有效三角形的个数 - 力扣(LeetCode)

题干:

数据范围:

例子:

思考:

本题无非就是枚举出所有的三个数,然后判断这三个数能否组成三角形;

Q:如何判断三个数能否构成三角形?

  • 首先会想到的是“两边之和大于第三边”,让三个数两两组合然后与第三个数比较,看是否符合就行,但是这种判断方式需要判断三次,效率上有点低,有没有高效点的判断方法?

第二种判断方法:让较小两边相加与最长边比较,如果是大于则就可以构成三角形

因为最长边一定是大于较小边的(另外两个情况),所以只要保证让较小两边相加大于最长边便可,图解如下:

而对于枚举,首先我们一定会想到的是暴力解法,利用循环枚举出所有的情况,然后判断,这种方法的时间复杂度为O(N^3),先试一下暴力解法能否通过:

使用暴力解法,测试用例可以通过,但是提交:

不能使用暴力解法解决,还能怎么做?

我们前面曾说,判断两个数能够构成三角形,如果得到了这三个数的大小关系,可以拿较小的两个数与最大的那一个数进行比较,不可能每次拿到三个数就先比较大小吧?暴力枚举依然是个痛处,既然在比较的时候就要知道数据的大小关系,那么我们可以先对数据进行排序,利用数据的单调性以及三指针

  • 当 b + c > a 时(即 b 和 c 指向的数据之和大于 a 指向的数据),这三个数必定可以构成三角形。此时,区间 [b+1, c-1] 内的数据均大于 b,且与 c 相加后仍满足大于 a 的条件,那么就有(c-1-b+1)个数符合要求,利用变量记录;然后 c 减 1,继续在下一个区间进行判断
  • 当 b + c < a 时(即 b 和 c 指向的数据之和小于 a 指向的数据),这三个数无法构成三角形。此时,区间 [b+1, c-1] 内的数据均小于 c 指向的数据,不符合要求,无需记录,直接让 b 加 1,继续在下一个区间中寻找符合条件的组合。

最大的数a 从右往左遍历,b初始化为0,c初始化为a-1;

这就是解法二:利用单调性,使用双指针方法来解决问题,稍微总结一下:

  • 1、先固定最大的数
  • 2、在最大的数的左区间中,使用双指针算法,快速统计出符合要求的三元组的个数;

举个例子:

参考代码:

    int triangleNumber(vector<int>& nums) {//先对数据进行排序处理sort(nums.begin() , nums.end());int n = nums.size();int a = n-1 , ret = 0;//指向最大的指针for( ; a>=2;a--){int b = 0, c = a-1;//让较小的两个while(b<c){if(nums[b]+nums[c]>nums[a]) //b->[b,c-1] 区间中的数据均合理 {ret+=(c-1-b+1);c--;//去下一个区间}else //不符合要求,那么c->[b+1,c] 中的均不符合{b++;}}}return ret;}

题6 查找总价格为目标值的两个商品:

LCR 179. 查找总价格为目标值的两个商品 - 力扣(LeetCode)

题目:

数据范围:

例子:

思考:

方法一:暴力解法

将所有的两个数的组合列举出来然后进行比较

伪代码:

可以试一下用暴力解法能否通过算法:

提交:

暴力解法不行;

方法二:题干中说过price 数组中的数据为升序,我们可以利用好单调性;最先想到的可能是二分算法,但是此处不推荐使用二分,我们可以利用单调性+双指针来解决;

设置两个指针:left 与right , 让left 指向最左的数据,让right 指向最大的数据,如果left + right 的结果大于 target ,那么right--;如果left + right 的结果小于target 那么left++;图解如下:

总结算法逻辑:

参考代码:

    vector<int> twoSum(vector<int>& price, int target){//利用数据的单调性+双指针int n = price.size();int left = 0, right = n-1;while(left < right){if(price[left]+price[right] > target) right--;else if(price[left]+price[right] < target) left++;else return {price[left] , price[right]};}//没有找到,返回空return{};}

题7 三数之和:

15. 三数之和 - 力扣(LeetCode)

题干如下:

数据范围:

例子:

思考:

即在数组中找到三个不重复的数据让其相加为0;

根据前面做过的题的经验,我们可以先将数据进行排序处理;

Q:如何让找到的三个数据不重复呢?

  • 可以首先将nums 中的数据进行去重处理,利用set就可以了;

解法一:暴力解法:排序 + 暴力枚举 + 利用set 进行去重

此处就不验证暴力解法是否能通过了,数据量有10万,时间复杂度为O(N^3) 的算法一定会超时;

解法二:排序 +  固定一个数a ,利用双指针找到何为-a 的两个值

这样的话,”利用双指针找到何为-a 的两个值“ 的思路就与题6中的思路非常像;

Q:那么去重呢?

  • 笔试中可以利用容器set进行去重,但是在面试中不推荐这么做;本题,我们开始就对数据进行了排序处理,那么相同的数据就已经放在了一起;当我们找到了一个结果的时候left 和 right 该如何移动?left 和 right 要跳过与当前所指数相同的重复的数据,继续缩小空间继续查找,同样的,我们固定的数a 也需要进行去重处理,当使用完一轮双指针算法之后,a 也需要跳过重复的数据;

要做到不重不漏

参考代码:

    vector<vector<int>> threeSum(vector<int>& nums) {//首先先对数组进行排序sort(nums.begin(), nums.end());int n = nums.size();vector<vector<int>> ret;for(int i = 0 ;i< n; ){int left = i+1, right = n-1;while(left < right){int target = -nums[i];int sum = nums[left] + nums[right];if(sum > target) right--;else if(sum < target) left++;else{ret.push_back({nums[i], nums[left] , nums[right]});left ++ ,right--;//去重while( left < right && nums[left] == nums[left-1]) left++;while( left < right && nums[right] == nums[right+1]) right--;}}//一轮双指针结束之后,还要对固定的数进行去重处理++i;while(i<n && nums[i] == nums[i-1]) ++i;}return ret;}

题8 四数之和:

18. 四数之和 - 力扣(LeetCode)

题干:

数据范围:

例子:

思考:

本题的解题思路非常浅显:找到4个数 + 判断是否相加为target

找数就有讲究了,要么暴力枚举,要么使用比较巧妙的方法,同样的,本题要求不包含重复的数据,我们可以考虑使用set 去重;

通过数据范围就知道,我们要使用long long

解法一:排序 + 暴力解法 + 利用set去重

本题的数据量很大,并且要暴力枚举出4个数,实践复杂度非常高,一定会超时,此处就不演示了;

解法二:排序 + 双指针

可以参考上题三数之和的思路;

首先是将数据进行排序,利用数据有序的特点可以提高效率;然后是固定一个数,再固定一个数,剩下两个数利用双指针;可以理解为,我们先固定一个数a,那么题目就变成在除了固定的的这个数中找和为 (target-a)的三个数:

最后需要做到“不重不漏”,本题会设置三个循环,两个循环用来固定两个数,一个循环适用于双指针,这三个循环都需要关注去重处理(如果不用set 去重的话);而关于不漏,在双指针查找的过程中,我们要在left 和 right 中找到和为目标值时,不能直接结束当前的双指针查找循环,而是要left++,right-- 且left<right ,继续查找下去;

初次尝试:;

计算目标值的时候,记得用long long!

参考代码:

    vector<vector<int>> fourSum(vector<int>& nums, int target) {//首先对数据进行排序sort(nums.begin() , nums.end());int n = nums.size();vector<vector<int>> ret;//固定数afor(int i = 0; i<n; ){//固定数bfor(int j = i+1;j<n; ){long long t = ( long long)target - nums[i] -nums[j];//双指针查找int left = j+1,right = n-1;while(left < right){int sum = nums[left] + nums[right];if(sum > t) right--;else if(sum < t) left++;else{//将数据放入数组中ret.push_back({nums[i] , nums[j] , nums[left] , nums[right]});//去重left++,right--;while(left < right && nums[left] == nums[left-1]) left++;while(left < right && nums[right] == nums[right+1]) right--;}}//固定的第二个数的去重++j;while(j<n && nums[j] == nums[j-1])j++;}//固定的第一个数的去重++i;while(i<n && nums[i] == nums[i-1])i++;}return ret;}

总结

双指针题单如下,可以自己练习:

  1. 283.移动零
  2. 1089. 复写零
  3. 202. 快乐数
  4. 11. 盛最多水的容器
  5. 611. 有效三角形的个数
  6. LCR 179. 查找总价格为目标值的两个商品
  7. 15. 三数之和
  8. 18. 四数之和

经过以上练习,我们应该可以显然地感受到这类题的特点:从两端向中间出发,逐渐缩小数据范围,必要时,还可以借助于数据的单调性一起使用;借助于单调性会极大地提高代码的效率;

相关文章:

leetcode - 双指针问题

文章目录 前言 题1 移动零&#xff1a; 思路&#xff1a; 参考代码&#xff1a; 题2 复写零&#xff1a; 思考&#xff1a; 参考代码&#xff1a; 题3 快乐数&#xff1a; 思考&#xff1a; 参考代码&#xff1a; 题4 盛最多水的容器&#xff1a; 思考&#xff1a;…...

Jsp技术入门指南【十一】SQL标签库

Jsp技术入门指南【十一】SQL标签库 前言一、SQL标签库概述1. 什么是SQL标签库&#xff0c;有什么用&#xff1f;2. SQL标签库怎么用&#xff1f; 二、常用SQL标签库详解3.1 sql:selDtataSource&#xff08;配置数据源&#xff09;3.2 sql:query&#xff08;执行查询&#xff09…...

MySQL初阶:数据库约束和表的设计

数据库约束 数据库约束是针对数据库中的表中的数据进行施加规则和条件&#xff0c;用于确保数据的准确性和可靠性。 数据库约束类型 1&#xff09;not null 非空类型 &#xff1a;指定非空类型的列不能存储null&#xff0c;如果插入的数据是null便会报错。 2&#xff09;de…...

2025年API安全防御全解析:应对DDoS与CC攻击的智能策略

2025年&#xff0c;API作为数字生态的核心枢纽&#xff0c;已成为攻击者的主要目标。DDoS攻击规模突破T级峰值&#xff0c;CC攻击则借助AI技术模拟真实用户行为&#xff0c;传统防御手段面临失效风险。如何在保障高并发业务稳定性的同时抵御复杂攻击&#xff1f;本文结合前沿技…...

【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)高级用法

Bootstrap V4系列 学习入门教程之 组件-表单&#xff08;Forms&#xff09;高级用法 Layout 布局一、Form groups 表单组二、Form grid 表单网格2.1 Form row 表单行2.2 Horizontal form 水平形式表单2.3 Column sizing 列尺寸2.4 Auto-sizing 自动调整大小 三、Inline forms 内…...

Redis 主从复制集群搭建教程

目录 为什么要搭建 Redis 主从复制集群&#xff1f;搭建 Redis 主从复制集群前提条件步骤一&#xff1a;创建 Docker 网络步骤二&#xff1a;启动 Redis 主节点步骤三&#xff1a;启动 Redis 从节点步骤四&#xff1a;验证复制状态步骤五&#xff1a;使用 Python 连接 Redis 集…...

使用AES-CBC + HMAC-SHA256实现前后端请求安全验证

AES-CBC HMAC-SHA256 加密验证方案&#xff0c;下面是该方案二等 优点 与 缺点 表格&#xff0c;适用于文档、评审或技术选型说明。 ✅ 优点表格&#xff1a;AES-CBC HMAC-SHA256 加密验证方案 类别优点说明&#x1f510; 安全性使用 AES-CBC 对称加密使用 AES-128-CBC 是可…...

耳机插进电脑只有一边有声音怎么办 解决方法分享

当您沉浸在音乐或电影中时&#xff0c;如果突然发现耳机只有一边有声音&#xff0c;这无疑会破坏您的体验。本文将提供一系列检查和修复方法&#xff0c;帮助您找出并解决问题&#xff0c;让您的耳机恢复正常的立体声效果。 一、检查耳机连接是否正常 首先需要确认耳机与播放设…...

【物联网】基于树莓派的物联网开发【1】——初识树莓派

使用背景 物联网开发从0到1研究&#xff0c;以树莓派为基础 场景介绍 系统学习Linux、Python、WEB全栈、各种传感器和硬件 接下来程序猫将带领大家进军物联网世界&#xff0c;从0开始入门研究树莓派。 认识树莓派 正面图示&#xff1a; 1&#xff1a;树莓派简介 树莓派…...

AI生成虚假漏洞报告污染漏洞赏金平台

漏洞赏金计划遭遇AI伪造报告冲击 曾经因激励独立研究人员报告真实漏洞而备受赞誉的漏洞赏金计划&#xff0c;如今正面临AI生成虚假漏洞报告的重大挑战。这些伪造的漏洞报告在业内被称为"AI垃圾"&#xff0c;不仅浪费维护人员的时间&#xff0c;更令人担忧的是&#…...

一种安全不泄漏、高效、免费的自动化脚本平台

在数字化转型加速的今天&#xff0c;自动化脚本工具已成为提升效率的重要助手。然而&#xff0c;用户在选择这类工具时&#xff0c;往往面临两大核心关切&#xff1a;安全性与成本。冰狐智能辅助&#xff08;IceFox Intelligent Assistant&#xff09;作为一款新兴的自动化脚本…...

MongoDB知识框架

简介&#xff1a;MongoDB 是一个基于分布式文件存储的数据库&#xff0c;属于 NoSQL 数据库产品&#xff0c;以下是其知识框架总结&#xff1a; 一、数据模型 文档&#xff1a;MongoDB 中的数据以 BSON&#xff08;二进制形式的 JSON&#xff09;格式存储在集合中&#xff0c;…...

2025数维杯数学建模C题完整分析参考论文(共36页)(含模型、可运行代码、数据)

2025数维杯数学建模竞赛C题完整参考论文 目录 摘要 一、问题重述 二、问题分析 三、模型假设 四、符合与定义说明 五、 模型建立与求解 5.1问题1 5.1.1问题1思路分析 5.1.2问题1模型建立 5.1.3问题1求解结果 5.2问题2 5.2.1问题2思路分析 5.2.2问题2…...

深度学习 ———— 迁移学习

迁移学习原理 什么是迁移学习&#xff1f; 迁移学习利用在大规模数据集&#xff08;如ImageNet&#xff09;上预训练的模型&#xff0c;改装小数据集&#xff08;如CIFAR-10&#xff09;。优势&#xff1a; 减少训练时间&#xff1a;预训练模型已学习通用特征&#xff08;如边…...

第十七章,反病毒---防病毒网管

基于杀毒软件的一种防御技术&#xff0c;是一种被动 的防御技术。 防病毒网关和主机上的杀毒软件在功能上互补和协作的关系。 病毒 --- 一般是感染或者附着在应用程序或文件中的&#xff1b;一般都是通过邮件或文件共享的方式进行传 输&#xff0c;从而对主机进行破坏 。 计…...

信赖域策略优化TRPO算法详解:python从零实现

&#x1f9e0; 向所有学习者致敬&#xff01; “学习不是装满一桶水&#xff0c;而是点燃一把火。” —— 叶芝 我的博客主页&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 欢迎点击加入AI人工智能社区&#xff01; &#x1f680; 让我们一起努力&#xff0c;共创…...

powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址)

目录 1. powershell_bypass.cna 插件&#xff08;适配 Cobalt Strike 4.0 的免费版本下载地址&#xff09; 2. 生成 EXE 文件时出现 "运行异常&#xff0c;请查看 Script Console" 的处理方法 处理步骤 3. powershell_bypass.cna 插件的功能及实际操作步骤 功能…...

从Dockerfile 构建docker镜像——保姆级教程

从Dockfile开始 dockerfile简介开始构建1、编辑dockerfile2、构建镜像3、拉取镜像4、推送到镜像仓库 镜像的优化1、优化的基本原则2、多阶段构建 dockerfile简介 开始构建 1、编辑dockerfile # 使用官方的 Python 3.8 镜像作为基础镜像 FROM python:3.8-slim# 设置工作目录 …...

Mac配置php开发环境(多PHP版本,安装Redis)

配置PHP开发环境 配置多版本PHP 因为开发需要&#xff0c;有时需要根据项目及时切换多个版本&#xff0c;除了使用Docker以外&#xff0c;常用的就是直接在mac配置PHP版本 使用 Homebrew Mac 可以通过 Homebrew 来安装或切换 PHP 版本&#xff1a; brew update brew insta…...

Quorum协议原理与应用详解

一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议&#xff0c;通过权衡一致性&#xff08;C&#xff09;与可用性&#xff08;A&#xff09;实现数据冗余和最终一致性。其核心规则为&#xff1a; W&#xff08;写成功副本数&#xff09; …...

五一旅游潮涌:数字化如何驱动智慧旅游升级

文化和旅游部5月6日公布2025年“五一”假期文化和旅游市场情况&#xff0c;经文化和旅游部数据中心测算&#xff0c;假期5天&#xff0c;全国国内出游3.14亿人次&#xff0c;同比增长6.4%&#xff1b;国内游客出游总花费1802.69亿元&#xff0c;同比增长8.0%。在这组流动的数字…...

WPF 3D图形编程核心技术解析

一、三维坐标系系统 WPF采用右手坐标系系统&#xff0c;空间定位遵循&#xff1a; X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…...

BLURRR剪辑软件免费版:创意剪辑,轻松上手,打造个性视频

BLURRR剪辑软件免费版是一款功能强大、简约易用且充满创意的视频剪辑软件。它集多种功能于一体&#xff0c;无论是新手还是资深用户&#xff0c;都能通过简单的操作剪辑出高质量、富有创意的视频。BLURRR不仅提供了丰富的剪辑工具&#xff0c;还划分了不同的内容模块&#xff0…...

TIME - MoE 模型代码 3.2——Time-MoE-main/time_moe/datasets/time_moe_dataset.py

源码&#xff1a;GitHub - Time-MoE/Time-MoE: [ICLR 2025 Spotlight] Official implementation of "Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts" 这段代码定义了一个用于时间序列数据处理的 TimeMoEDataset 类&#xff0c;支…...

解决SQL Server SQL语句性能问题(9)——正确使用索引

前述章节中,我们介绍和讲解了SQL调优所需要的基本知识和分析方法,那么,通过前述这些知识和方法定位到问题后,接下来,我们该怎么做呢?那就是本章的内容,给出解决SQL语句性能问题的、科学而合理的方案和方法。 本章主要对解决SQL语句性能问题的几种常用方法进行说明和讲解…...

【论文阅读】FreePCA

FreePCA: Integrating Consistency Information across Long-short Frames in Training-free Long Video Generation via Principal Component Analysis 原文摘要 问题背景 核心挑战&#xff1a; 长视频生成通常依赖在短视频上训练的模型&#xff0c;但由于视频帧数增加会导致数…...

leetcode 383. Ransom Note

题目描述 代码 class Solution { public:bool canConstruct(string ransomNote, string magazine) {vector<int> table(26,0);for(char ch : magazine){table[ch-a];}for(char ch : ransomNote){table[ch-a]--;if(table[ch-a] < 0)return false;}return true;} };...

SAF利用由Varjo和AFormX开发的VR/XR模拟器推动作战训练

通过将AFormX的先进军用飞行模拟器与Varjo的行业领先的VR/XR硬件相结合&#xff0c;斯洛文尼亚武装部队正以经济高效、沉浸式的训练方式培训战斗机飞行员&#xff0c;以提高其战术准备和作战效率。 挑战&#xff1a;获得战术军事航空训练的机会有限 军事航空训练长期以来一直…...

基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践

随着医疗健康数据的爆发式增长,如何有效整合、分析和利用这些数据已成为公共卫生领域的重要挑战。传统方法往往难以应对数据的复杂性、多样性和海量性,而人工智能技术的迅猛发展为解决这些挑战提供了新的可能性。基于数据整合与公共卫生大数据的AI平台旨在构建一个全面的生态…...

【Pandas】pandas DataFrame clip

Pandas2.2 DataFrame Computations descriptive stats 方法描述DataFrame.abs()用于返回 DataFrame 中每个元素的绝对值DataFrame.all([axis, bool_only, skipna])用于判断 DataFrame 中是否所有元素在指定轴上都为 TrueDataFrame.clip([lower, upper, axis, inplace])用于截…...

深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒​&#x1f338;​ 博客主页&#xff1a;羊小猪~~-CSDN博客 内容简介&#xff1a;常见目标检测算法简介​&#x1f…...

嵌套路由~

### 作业 - App.vue vue <script setup></script> <template> <router-link to"/home">首页</router-link> <router-link to"/profile">个人资料</router-link> <router-link to"/posts"&g…...

影楼精修-牙齿美型修复算法解析

本文介绍影楼修图中的牙齿美型修复功能的算法实现。 我们大部分人的牙齿看起来都可能会有一些问题&#xff0c;比如牙齿不平整&#xff0c;大门牙&#xff0c;牙齿泛黄&#xff0c;牙齿发黑&#xff0c;牙齿残缺等等&#xff0c;拍照之后影响美观度&#xff0c;正是这个爱美的…...

k8s之ingress

在前面我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort 和 LoadBalance,但是这两种方式,都有一定的缺点 NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就更加明显,L4转发,无法根据http header和path进行路由转发…...

PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!

要想LLM大模型性能更佳&#xff0c;我们需要喂给模型看得懂的高质量数据。那有没有一种方法&#xff0c;能让我们把各种文档“读懂”&#xff0c;再喂给大模型使用呢&#xff1f; 如果你用传统OCR工具直接从PDF中提取文本&#xff0c;结果往往是乱序、缺失、格式错乱。因为实际…...

Ubuntu 第11章 网络管理_常用的网络配置命令

为了管理网络&#xff0c;Linux提供了许多非常有用的网络管理命令。利用这些命令&#xff0c;一方面可以有效地管理网络&#xff0c;另一方面出现网络故障时&#xff0c;可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...

C++ 观察者模式详解

观察者模式&#xff08;Observer Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了对象间的一对多依赖关系&#xff0c;当一个对象&#xff08;主题&#xff09;状态改变时&#xff0c;所有依赖它的对象&#xff08;观察者&#xff09;都会自动得到通知并更新。 核…...

不止是UI库:React如何重塑前端开发范式?

React&#xff1a;引领现代前端开发的声明式UI库 在当今快速发展的前端世界&#xff0c;React以其声明式、组件化和高效的特性&#xff0c;稳坐头把交椅&#xff0c;成为构建交互式用户界面的首选JavaScript库。本文将带你快速了解React的核心魅力、主要优势以及生态发展&…...

MapReduce报错 HADOOP_HOME and hadoop.home.dir are unset.

运行课程讲解内容出现这个报错&#xff1a; 1、在电脑里解压之前发过的Hadoop安装包 2、配置用户变量 3、配置系统变量 4、配置系统Path变量 5、下载链接的两个文件&#xff1a; 链接: https://pan.baidu.com/s/1aCcpGGR1EE4hEZW624rFmQ?pwd56tv 提取码: 56tv –来自百度…...

深入探索Laravel框架中的Blade模板引擎

Laravel是一个广泛使用的PHP框架&#xff0c;以其简洁、优雅和强大的功能著称。Blade是Laravel内置的模板引擎&#xff0c;提供了一套简洁而强大的模板语法&#xff0c;帮助开发者轻松构建视图层。本文将深入探讨Blade模板引擎的特性、使用方法和最佳实践。 1. Blade模板引擎简…...

分析NVIDIA的股价和业绩暴涨的原因

NVIDIA自2016年以来股价与业绩的持续高增长&#xff0c;是多重因素共同作用的结果。作为芯片行业的领军企业&#xff0c;NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度&#xff0c;深入分析其成功原因&#xf…...

P2572 [SCOI2010] 序列操作 Solution

Description 给定 01 01 01 序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1​,a2​,⋯,an​)&#xff0c;并定义 f ( l , r ) [ ( ∑ i l r a i ) r − l 1 ] f(l,r)[(\sum\limits_{il}^r a_i)r-l1] f(l,r)[(il∑r​ai​)r−l1]. 执行 m m m 个操作&am…...

初等数论--欧拉函数积性的证明

文章目录 1. 简介2. 证明一&#xff1a;唯一分解定理容斥原理3. 证明二&#xff1a;中国剩余定理4. 引理证明5. 参考 1. 简介 欧拉函数 ϕ ( n ) \phi(n) ϕ(n)表示在小于等于 n n n的正整数中与 n n n互质的个数。 如 ϕ ( 6 ) 2 ( 1 5 ) ϕ ( 12 ) 4 ( 1 5 7 11 ) \phi(…...

MCP(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议

核心定义 MCP&#xff08;Model Context Protocol&#xff09;是专为LLM&#xff08;大语言模型&#xff09;应用设计的标准化协议&#xff0c;通过安全可控的方式向AI应用暴露数据和功能。主要提供以下能力&#xff1a; 标准化的上下文管理安全的功能调用接口跨平台的数据交…...

Midscene.js Chrome 插件实战:AI 驱动的 UI 自动化测试「喂饭教程」

Midscene.js Chrome 插件实战:AI 驱动的 UI 自动化测试「喂饭教程」 前言一、Midscene.js 简介二、环境准备与插件安装1. 安装 Chrome 插件2. 配置模型与 API Key三、插件界面与功能总览四、实战演练:用自然语言驱动网页自动化1. 典型场景一(Action):账号登录步骤一:打开…...

Python在大数据机器学习模型的多模态融合:深入探索与实践指南

一、多模态融合的全面概述 1.1 多模态融合的核心概念 多模态融合(Multimodal Fusion)是指将来自不同传感器或数据源(如图像、文本、音频、视频、传感器数据等)的信息进行有效整合,以提升机器学习模型的性能和鲁棒性。在大数据环境下,多模态融合面临着独特的挑战和机遇: 数…...

C++ 访问者模式详解

访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你将算法与对象结构分离&#xff0c;使得可以在不修改现有对象结构的情况下定义新的操作。 核心概念 设计原则 访问者模式遵循以下设计原则&#xff1a; 开闭原则&#xff1a;可以添…...

实验-有限状态机2(数字逻辑)

目录 一、实验内容 1.1 介绍 1.2 内容 二、实验步骤 2.1 电路原理图 2.2 步骤 2.3 状态图 4.4 状态转换表和输出表 2.5 具体应用场景 三、调试 四、实验使用环境 五、实验小结与思考 5.1 遇到的问题及解决方法 5.2 实验收获 一、实验内容 1.1 介绍 在解决更复…...

IC解析之TPS92682-Q1(汽车LED灯控制IC)

目录 1 IC特性介绍2 主要参数3 接口定义4 工作原理分析TPS92682-Q1架构工作模式典型应用通讯协议 控制帧应答帧协议5 总结 1 IC特性介绍 TPS92682 - Q1 是德州仪器&#xff08;TI&#xff09;推出的一款双通道恒压横流控制器&#xff0c;同时还具有各种电器故障保护&#xff0c…...

数据结构-堆

目录 heapq 导入 初始化 插入元素 返回最小值 PriorityQueue 导入 初始化 入队 出队 堆是一颗树&#xff0c;其每个节点都有一个值&#xff0c;且&#xff08;小根堆&#xff1a;每个父节点都小于等于其子节点 &#xff08;在进树时不断进行比较 STL中的 priority…...