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;}
总结
双指针题单如下,可以自己练习:
- 283.移动零
- 1089. 复写零
- 202. 快乐数
- 11. 盛最多水的容器
- 611. 有效三角形的个数
- LCR 179. 查找总价格为目标值的两个商品
- 15. 三数之和
- 18. 四数之和
经过以上练习,我们应该可以显然地感受到这类题的特点:从两端向中间出发,逐渐缩小数据范围,必要时,还可以借助于数据的单调性一起使用;借助于单调性会极大地提高代码的效率;
相关文章:
leetcode - 双指针问题
文章目录 前言 题1 移动零: 思路: 参考代码: 题2 复写零: 思考: 参考代码: 题3 快乐数: 思考: 参考代码: 题4 盛最多水的容器: 思考:…...
Jsp技术入门指南【十一】SQL标签库
Jsp技术入门指南【十一】SQL标签库 前言一、SQL标签库概述1. 什么是SQL标签库,有什么用?2. SQL标签库怎么用? 二、常用SQL标签库详解3.1 sql:selDtataSource(配置数据源)3.2 sql:query(执行查询)…...
MySQL初阶:数据库约束和表的设计
数据库约束 数据库约束是针对数据库中的表中的数据进行施加规则和条件,用于确保数据的准确性和可靠性。 数据库约束类型 1)not null 非空类型 :指定非空类型的列不能存储null,如果插入的数据是null便会报错。 2)de…...
2025年API安全防御全解析:应对DDoS与CC攻击的智能策略
2025年,API作为数字生态的核心枢纽,已成为攻击者的主要目标。DDoS攻击规模突破T级峰值,CC攻击则借助AI技术模拟真实用户行为,传统防御手段面临失效风险。如何在保障高并发业务稳定性的同时抵御复杂攻击?本文结合前沿技…...
【Bootstrap V4系列】学习入门教程之 组件-表单(Forms)高级用法
Bootstrap V4系列 学习入门教程之 组件-表单(Forms)高级用法 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 主从复制集群?搭建 Redis 主从复制集群前提条件步骤一:创建 Docker 网络步骤二:启动 Redis 主节点步骤三:启动 Redis 从节点步骤四:验证复制状态步骤五:使用 Python 连接 Redis 集…...
使用AES-CBC + HMAC-SHA256实现前后端请求安全验证
AES-CBC HMAC-SHA256 加密验证方案,下面是该方案二等 优点 与 缺点 表格,适用于文档、评审或技术选型说明。 ✅ 优点表格:AES-CBC HMAC-SHA256 加密验证方案 类别优点说明🔐 安全性使用 AES-CBC 对称加密使用 AES-128-CBC 是可…...
耳机插进电脑只有一边有声音怎么办 解决方法分享
当您沉浸在音乐或电影中时,如果突然发现耳机只有一边有声音,这无疑会破坏您的体验。本文将提供一系列检查和修复方法,帮助您找出并解决问题,让您的耳机恢复正常的立体声效果。 一、检查耳机连接是否正常 首先需要确认耳机与播放设…...
【物联网】基于树莓派的物联网开发【1】——初识树莓派
使用背景 物联网开发从0到1研究,以树莓派为基础 场景介绍 系统学习Linux、Python、WEB全栈、各种传感器和硬件 接下来程序猫将带领大家进军物联网世界,从0开始入门研究树莓派。 认识树莓派 正面图示: 1:树莓派简介 树莓派…...
AI生成虚假漏洞报告污染漏洞赏金平台
漏洞赏金计划遭遇AI伪造报告冲击 曾经因激励独立研究人员报告真实漏洞而备受赞誉的漏洞赏金计划,如今正面临AI生成虚假漏洞报告的重大挑战。这些伪造的漏洞报告在业内被称为"AI垃圾",不仅浪费维护人员的时间,更令人担忧的是&#…...
一种安全不泄漏、高效、免费的自动化脚本平台
在数字化转型加速的今天,自动化脚本工具已成为提升效率的重要助手。然而,用户在选择这类工具时,往往面临两大核心关切:安全性与成本。冰狐智能辅助(IceFox Intelligent Assistant)作为一款新兴的自动化脚本…...
MongoDB知识框架
简介:MongoDB 是一个基于分布式文件存储的数据库,属于 NoSQL 数据库产品,以下是其知识框架总结: 一、数据模型 文档:MongoDB 中的数据以 BSON(二进制形式的 JSON)格式存储在集合中,…...
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…...
深度学习 ———— 迁移学习
迁移学习原理 什么是迁移学习? 迁移学习利用在大规模数据集(如ImageNet)上预训练的模型,改装小数据集(如CIFAR-10)。优势: 减少训练时间:预训练模型已学习通用特征(如边…...
第十七章,反病毒---防病毒网管
基于杀毒软件的一种防御技术,是一种被动 的防御技术。 防病毒网关和主机上的杀毒软件在功能上互补和协作的关系。 病毒 --- 一般是感染或者附着在应用程序或文件中的;一般都是通过邮件或文件共享的方式进行传 输,从而对主机进行破坏 。 计…...
信赖域策略优化TRPO算法详解:python从零实现
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…...
powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址)
目录 1. powershell_bypass.cna 插件(适配 Cobalt Strike 4.0 的免费版本下载地址) 2. 生成 EXE 文件时出现 "运行异常,请查看 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 因为开发需要,有时需要根据项目及时切换多个版本,除了使用Docker以外,常用的就是直接在mac配置PHP版本 使用 Homebrew Mac 可以通过 Homebrew 来安装或切换 PHP 版本: brew update brew insta…...
Quorum协议原理与应用详解
一、Quorum 协议核心原理 基本定义 Quorum 是一种基于 读写投票机制 的分布式一致性协议,通过权衡一致性(C)与可用性(A)实现数据冗余和最终一致性。其核心规则为: W(写成功副本数) …...
五一旅游潮涌:数字化如何驱动智慧旅游升级
文化和旅游部5月6日公布2025年“五一”假期文化和旅游市场情况,经文化和旅游部数据中心测算,假期5天,全国国内出游3.14亿人次,同比增长6.4%;国内游客出游总花费1802.69亿元,同比增长8.0%。在这组流动的数字…...
WPF 3D图形编程核心技术解析
一、三维坐标系系统 WPF采用右手坐标系系统,空间定位遵循: X 轴 → 右 Y 轴 → 上 Z 轴 → 观察方向 X轴 \rightarrow 右\quad Y轴 \rightarrow 上\quad Z轴 \rightarrow 观察方向 X轴→右Y轴→上Z轴→观察方向 三维坐标值表示为 ( x , y , z ) (x, y,…...
BLURRR剪辑软件免费版:创意剪辑,轻松上手,打造个性视频
BLURRR剪辑软件免费版是一款功能强大、简约易用且充满创意的视频剪辑软件。它集多种功能于一体,无论是新手还是资深用户,都能通过简单的操作剪辑出高质量、富有创意的视频。BLURRR不仅提供了丰富的剪辑工具,还划分了不同的内容模块࿰…...
TIME - MoE 模型代码 3.2——Time-MoE-main/time_moe/datasets/time_moe_dataset.py
源码:GitHub - Time-MoE/Time-MoE: [ICLR 2025 Spotlight] Official implementation of "Time-MoE: Billion-Scale Time Series Foundation Models with Mixture of Experts" 这段代码定义了一个用于时间序列数据处理的 TimeMoEDataset 类,支…...
解决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 原文摘要 问题背景 核心挑战: 长视频生成通常依赖在短视频上训练的模型,但由于视频帧数增加会导致数…...
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硬件相结合,斯洛文尼亚武装部队正以经济高效、沉浸式的训练方式培训战斗机飞行员,以提高其战术准备和作战效率。 挑战:获得战术军事航空训练的机会有限 军事航空训练长期以来一直…...
基于公共卫生大数据收集与智能整合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)
博主简介:努力学习的22级本科生一枚 🌟;探索AI算法,C,go语言的世界;在迷茫中寻找光芒🌸 博客主页:羊小猪~~-CSDN博客 内容简介:常见目标检测算法简介…...
嵌套路由~
### 作业 - App.vue vue <script setup></script> <template> <router-link to"/home">首页</router-link> <router-link to"/profile">个人资料</router-link> <router-link to"/posts"&g…...
影楼精修-牙齿美型修复算法解析
本文介绍影楼修图中的牙齿美型修复功能的算法实现。 我们大部分人的牙齿看起来都可能会有一些问题,比如牙齿不平整,大门牙,牙齿泛黄,牙齿发黑,牙齿残缺等等,拍照之后影响美观度,正是这个爱美的…...
k8s之ingress
在前面我们已经知道,Service对集群之外暴露服务的主要方式有两种:NodePort 和 LoadBalance,但是这两种方式,都有一定的缺点 NodePort方式的缺点是会占用很多集群机器的端口,那么当集群服务变多的时候,这个缺点就更加明显,L4转发,无法根据http header和path进行路由转发…...
PDF文档解析新突破:图表识别、公式还原、手写字体处理,让AI真正读懂复杂文档!
要想LLM大模型性能更佳,我们需要喂给模型看得懂的高质量数据。那有没有一种方法,能让我们把各种文档“读懂”,再喂给大模型使用呢? 如果你用传统OCR工具直接从PDF中提取文本,结果往往是乱序、缺失、格式错乱。因为实际…...
Ubuntu 第11章 网络管理_常用的网络配置命令
为了管理网络,Linux提供了许多非常有用的网络管理命令。利用这些命令,一方面可以有效地管理网络,另一方面出现网络故障时,可以快速进行诊断。本节将对Ubuntu提供的网络管理命令进行介绍。 11.2.1 ifconfig命令 关于ifconfig命令&…...
C++ 观察者模式详解
观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象间的一对多依赖关系,当一个对象(主题)状态改变时,所有依赖它的对象(观察者)都会自动得到通知并更新。 核…...
不止是UI库:React如何重塑前端开发范式?
React:引领现代前端开发的声明式UI库 在当今快速发展的前端世界,React以其声明式、组件化和高效的特性,稳坐头把交椅,成为构建交互式用户界面的首选JavaScript库。本文将带你快速了解React的核心魅力、主要优势以及生态发展&…...
MapReduce报错 HADOOP_HOME and hadoop.home.dir are unset.
运行课程讲解内容出现这个报错: 1、在电脑里解压之前发过的Hadoop安装包 2、配置用户变量 3、配置系统变量 4、配置系统Path变量 5、下载链接的两个文件: 链接: https://pan.baidu.com/s/1aCcpGGR1EE4hEZW624rFmQ?pwd56tv 提取码: 56tv –来自百度…...
深入探索Laravel框架中的Blade模板引擎
Laravel是一个广泛使用的PHP框架,以其简洁、优雅和强大的功能著称。Blade是Laravel内置的模板引擎,提供了一套简洁而强大的模板语法,帮助开发者轻松构建视图层。本文将深入探讨Blade模板引擎的特性、使用方法和最佳实践。 1. Blade模板引擎简…...
分析NVIDIA的股价和业绩暴涨的原因
NVIDIA自2016年以来股价与业绩的持续高增长,是多重因素共同作用的结果。作为芯片行业的领军企业,NVIDIA抓住了技术、战略、市场与行业趋势的机遇。以下从技术创新、战略布局、市场需求、财务表现及外部环境等维度,深入分析其成功原因…...
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),并定义 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∑rai)r−l1]. 执行 m m m 个操作&am…...
初等数论--欧拉函数积性的证明
文章目录 1. 简介2. 证明一:唯一分解定理容斥原理3. 证明二:中国剩余定理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(Model Context Protocol)是专为LLM(大语言模型)应用设计的标准化协议,通过安全可控的方式向AI应用暴露数据和功能。主要提供以下能力: 标准化的上下文管理安全的功能调用接口跨平台的数据交…...
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++ 访问者模式详解
访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将算法与对象结构分离,使得可以在不修改现有对象结构的情况下定义新的操作。 核心概念 设计原则 访问者模式遵循以下设计原则: 开闭原则:可以添…...
实验-有限状态机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 是德州仪器(TI)推出的一款双通道恒压横流控制器,同时还具有各种电器故障保护,…...
数据结构-堆
目录 heapq 导入 初始化 插入元素 返回最小值 PriorityQueue 导入 初始化 入队 出队 堆是一颗树,其每个节点都有一个值,且(小根堆:每个父节点都小于等于其子节点 (在进树时不断进行比较 STL中的 priority…...