算法题型讲解
一.双指针
主要分为俩种类型:
1.左右指针:双指针指向开头,以一定标准移动或交换,对区域进行划分,或找到特殊点的位置
(如:快慢指针判断有无环,移动零)
2.对撞指针:在有序或者特殊数组中,可以利用单调性,双指针分别指向开头和结尾,利用单调性,对数组中的元素进行排除,从而进行指针移动。
(如:找和为目标值的俩个数)
第一种类型题1
移动零
已解答
简单
相关标签
相关企业
提示
给定一个数组
nums
,编写一个函数将所有0
移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
提示:
1 <= nums.length <= 104
-231 <= nums[i] <= 231 - 1
进阶:你能尽量减少完成的操作次数吗?
题意讲解:就是将数组中的零移动到最后,并且不能复制数组。
算法原理:就是下面代码的逻辑
int n=nums.size();
int right=0;
int left=-1;
while(right<n)
{
if(nums[right]==0)
{
right++;
}
else if(nums[right]!=0)
{
left++;
swap(nums[left],nums[right]);
right++;
}
}
right遇到0元素++,遇到非零元素,先让left++,再交换元素,再让right++。主要目的就是划分成下面几个区域:
[0,left] 是非零元素,[left+1,right] 0元素,[right,n-1]待处理元素。
当right移动到中点就完成了。(快排也是这样的思路)
class Solution {
public:void moveZeroes(vector<int>& nums) {int n=nums.size();int right=0;int left=-1;while(right<n){if(nums[right]==0){right++;}else if(nums[right]!=0){left++;swap(nums[left],nums[right]);right++;} }}
};
2.第二种类型
179. 查找总价格为目标值的两个商品
已解答
简单
相关标签
相关企业
购物车内的商品价格按照升序记录于数组
price
。请在购物车中找到两个商品的价格总和刚好是target
。若存在多种情况,返回任一结果即可。示例 1:
输入:price = [3, 9, 12, 15], target = 18 输出:[3,15] 或者 [15,3]示例 2:
输入:price = [8, 21, 27, 34, 52, 66], target = 61 输出:[27,34] 或者 [34,27]
算法原理:
1.对数组进行排序,再让俩个指针(left,right)指向开头和结尾的位置
2.利用单调性:
当a[left]+a[right]大于target,说明右边的数和最小的数在一起都大了,右边这个数排除储数组,不再考虑。即right++。
当a[left]+a[right]小于target,说明左边的数和最大的数在一起都小了,左边这个数排除储数组,不再考虑。即left++。
代码如下:
class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {//利用单调性int n=price.size();int left=0;int right=n-1;vector<int> ret;while(right>left){if(price[left]+price[right]==target){ret.push_back(price[left]);ret.push_back(price[right]);break;}else if(price[left]+price[right]>target){right--;}else {left++;}}return ret;}
};
二.滑动窗口
特点:求一段连续的区间,需要利用单调性,左右指针不回退。
模板:
更新结果的位置不确定。
长度最小的子数组
已解答
中等
相关标签
相关企业
给定一个含有
n
个正整数的数组和一个正整数target
。找出该数组中满足其总和大于等于
target
的长度最小的 子数组[numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回0
。示例 1:
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组[4,3]
是该条件下的长度最小的子数组。示例 2:
输入:target = 4, nums = [1,4,4] 输出:1示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 104
代码:
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size();int left=0;int right=0;int sum=0;int len=INT_MAX;while(right<n){sum+=nums[right];//进窗口while(sum>=target)//判断{len=min(-left+right+1,len);//更新if(len==1){return 1;}sum-=nums[left]; left++;//出窗口}right++;}return len==INT_MAX?0:len;}
};
三.二分法
特点:数组具有二段性。
类型1:找一个值(在有序数组中二分查找一个值)
类型2:找左右区间。模板如下:
看题目快速理解。
在排序数组中查找元素的第一个和最后一个位置
已解答
中等
相关标签
相关企业
给你一个按照非递减顺序排列的整数数组
nums
,和一个目标值target
。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值
target
,返回[-1, -1]
。你必须设计并实现时间复杂度为
O(log n)
的算法解决此问题。示例 1:
输入:nums = [5,7,7,8,8,10]
, target = 8 输出:[3,4]示例 2:
输入:nums = [5,7,7,8,8,10]
, target = 6 输出:[-1,-1]示例 3:
输入:nums = [], target = 0 输出:[-1,-1]提示:
0 <= nums.length <= 105
-109 <= nums[i] <= 109
nums
是一个非递减数组-109 <= target <= 109
就是找等于目标值的左右区间。
我们以[5,6,7,8,8,8,8,9,9,10,10],taget=8为例子
可以划分成下面区域:
我们需要找到第2端的起始位置,也就是目标值的左区间。
我们需要找到第1端的终结位置,也就是目标值的右区间。
可以看到左右区间值将数组分成2端,这时具有二段性可以用二分法。
class Solution {
public:vector<int> searchRange(vector<int>& nums, int target) {vector<int>ret(2,-1);if(nums.size()==0){return ret;}int n=nums.size();int begin;int end;int left=0;int right=n-1;//1.找左区间while(left<right){int middle=left+(right-left)/2;if(nums[middle]<target){left=middle+1;}else{right=middle;}}if(nums[left]!=target){return ret;}ret[0]=(left);right=n-1;//2.找右边区间while(left<right){int middle=left+(right-left+1)/2;if(nums[middle]<=target){left=middle;}else{right=middle-1;}}ret[1]=(left);return ret;}
};
要注意几个点
1.循环条件为left<right,写成left<=right会死循环,同时left==right,就是最终值,不用再判断。
2.middle=left+(right-left)/2是在偶数个数取中间前面的一个。midddle=left+(right-left+1)/2是在偶数个数中取后面的一个。该怎么区分:
当right=middle-1时让middle=left+(right-left+1)/2。即有-1,再+1
原因:如找左区间时, int middle=left+(right-left)/2;
if(nums[middle]<target){left=middle+1;}else{right=middle;}
假设:当区间不断缩小为俩个值,区间为7,8。left指向7,right指向8。
不加1时,middle指向7,小于8,left=middle+1,left==right找到正确值。
加1时,middle指向8,right=middle,还是指向8.right不动了,死循环。
因此对于不同的情况要采用不同的取法。
四.前缀和
本质也就是动态规划的一种情况。常用于求一段满足特定条件的连续区间,可能会用到哈希表,找一段区间常用的是终点的dp-起点的dp。
1.一维前缀和
前缀和
- 题目
- 题解(49)
- 讨论(22)
- 排行
简单 通过率:27.59% 时间限制:1秒 空间限制:128M
校招时部分企业笔试将禁止编程题跳出页面,为提前适应,练习时请使用在线自测,而非本地IDE。
描述
给定一个长度为n的数组a1,a2,....ana1,a2,....an.
接下来有q次查询, 每次查询有两个参数l, r.
对于每个询问, 请输出al+al+1+....+aral+al+1+....+ar
输入描述:
第一行包含两个整数n和q.
第二行包含n个整数, 表示a1,a2,....ana1,a2,....an.
接下来q行,每行包含两个整数 l和r.
1≤n,q≤1051≤n,q≤105
−109≤a[i]≤109−109≤a[i]≤109
1≤l≤r≤n1≤l≤r≤n输出描述:
输出q行,每行代表一次查询的结果.
示例
输入:
3 2
1 2 4
1 2
13输出:
3
6
思路是建立一个dp表存入从起点到i位置的所有前缀和。
dp=dp[i-1]+nums[i];
要求l到r位置的前缀和就用dp[r]-dp[l-1]就行。
#include <iostream>
#include<vector>
using namespace std;int main() {int n;int q;cin>>n;cin>>q;vector<int> v(n+1,0);vector<long long> dp(n+1,0);for(int i=1;i<=n;i++){cin>>v[i];}for(int i=1;i<=n;i++){dp[i]=v[i]+dp[i-1];}for(int i=0;i<q;i++){int l,r;cin>>l>>r;cout<<dp[r]-dp[l-1]<<endl;}}
// 64 位输出请用 printf("%lld")
类型二:二维前缀和:
给你一个 n 行 m 列的矩阵 A ,下标从1开始。
接下来有 q 次查询,每次查询输入 4 个参数 x1, y1, x2, y2
请输出以(x1, y1) 为左上角, (x2, y2) 为右下角的子矩阵的和
第一行包含三个整数n, m, q.接下来n行,每行m个整数,代表矩阵的元素
接下来q行,每行4个整数x1, y1, x2, y2,分别代表这次查询的参数
输出描述:
输出q行,每行表示查询结果。
示例1
输入:
3 4 3
1 2 3 4
3 2 1 0
1 5 7 8
1 1 2 2
1 1 3 3
1 2 3 4
复制
输出:
8
25
32
思路:记录创建一个二维数组dp,dp[i][j]表示从起点到i,j位置的矩阵值。
dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+nums[i][j];
求x1,y1到x2,y2的值为
dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1];
代码:
#include <iostream>
#include <vector>
using namespace std;int main() {int n,m,q;cin>>n>>m>>q;vector<vector<int>>nums(n+1,vector<int>(m+1));vector<vector<long long>> dp(n+1,vector<long long>(m+1));for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>nums[i][j];}}for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){dp[i][j]=dp[i][j-1]+dp[i-1][j]-dp[i-1][j-1]+nums[i][j];}}int x1,x2,y1,y2;while(q--){cin>>x1>>y1>>x2>>y2;cout<<dp[x2][y2]-dp[x2][y1-1]-dp[x1-1][y2]+dp[x1-1][y1-1]<<endl;}}
// 64 位输出请用 printf("%lld")
要满足(dp[i]-d[j-1])%k==0,则dp[j-1]要和dp[i]具有相同的余数。即dp[j-1]=(dp[i]%p+p)%p。
和可被 K 整除的子数组
已解答
中等
相关标签
相关企业
给定一个整数数组
nums
和一个整数k
,返回其中元素之和可被k
整除的非空 子数组 的数目。子数组 是数组中 连续 的部分。
示例 1:
输入:nums = [4,5,0,-2,-3,1], k = 5 输出:7 解释: 有 7 个子数组满足其元素之和可被 k = 5 整除: [4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]示例 2:
输入: nums = [5], k = 9 输出: 0
class Solution {
public:int subarraysDivByK(vector<int>& nums, int k) {unordered_map<int,int> hash;hash[0]=1;//0这个数的余数int n=nums.size();int sum=0,ret=0;for(auto &x:nums){sum+=x;int find=(sum%k+k)%k;if(hash.count(find)){ret+=hash[find];}hash[find]++;}return ret;}
};
五.位运算
给你一个整数数组
nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
示例 1:
输入:nums = [1,2,1,3,2,5] 输出:[3,5] 解释:[5, 3] 也是有效的答案。示例 2:
输入:nums = [-1,0] 输出:[-1,0]示例 3:
输入:nums = [0,1] 输出:[1,0]提示:
2 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
- 除两个只出现一次的整数外,
nums
中的其他数字都出现两次
五.模拟
数青蛙
已解答
中等
相关标签
相关企业
提示
给你一个字符串
croakOfFrogs
,它表示不同青蛙发出的蛙鸣声(字符串"croak"
)的组合。由于同一时间可以有多只青蛙呱呱作响,所以croakOfFrogs
中会混合多个“croak”
。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
要想发出蛙鸣 "croak",青蛙必须 依序 输出
‘c’, ’r’, ’o’, ’a’, ’k’
这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串croakOfFrogs
不是由若干有效的 "croak" 字符混合而成,请返回-1
。示例 1:
输入:croakOfFrogs = "croakcroak" 输出:1 解释:一只青蛙 “呱呱” 两次示例 2:
输入:croakOfFrogs = "crcoakroak" 输出:2 解释:最少需要两只青蛙,“呱呱” 声用黑体标注 第一只青蛙 "crcoakroak" 第二只青蛙 "crcoakroak"示例 3:
输入:croakOfFrogs = "croakcrook" 输出:-1 解释:给出的字符串不是 "croak" 的有效组合
class Solution {
public:int minNumberOfFrogs(string croakOfFrogs) {int hash[5] = {0};string s = "croak";unordered_map <char,int> index;for(int i=0;i<5;i++){index[s[i]]=i;}for (int i = 0; i < croakOfFrogs.size(); i++) {char temp = croakOfFrogs[i];if (temp == 'c') {if (hash[4] > 0) {hash[4]--;hash[0]++;} else {hash[0]++;}} else {int cur = index[temp];int pre = cur - 1;if (hash[pre] > 0) {hash[pre]--;hash[cur]++;} else {return -1;}}}for(int i=0;i<4;i++){if(hash[i]>0){return -1;}}return hash[4];}
};
六.分治
类型一:三指针
用三个指针,left,i,right,[0,left]小于特定值,[left+1,i]等于特定值,[i+1,right]大于特定值。把区域分成三份,常用于重复元素多的快排,快速选择算法。
数组中的第K个最大元素
已解答
中等
相关标签
相关企业
给定整数数组
nums
和整数k
,请返回数组中第k
个最大的元素。请注意,你需要找的是数组排序后的第
k
个最大的元素,而不是第k
个不同的元素。你必须设计并实现时间复杂度为
O(n)
的算法解决此问题。示例 1:
输入:[3,2,1,5,6,4],
k = 2 输出: 5示例 2:
输入:[3,2,3,1,2,4,5,5,6],
k = 4 输出: 4提示:
1 <= k <= nums.length <= 105
-104 <= nums[i] <= 104
class Solution {int dfs(int begin,int end,vector<int>&nums,int k){if(begin>end){return -1;}int left=begin-1;int right=end+1;int value=nums[(rand()%(end-begin+1))+begin];for(int cur=left+1;cur<right;){if(nums[cur]>value){swap(nums[--right],nums[cur]);}else if(nums[cur]==value){cur++;}else{swap(nums[++left],nums[cur++]);}}int len1=end-right+1;int len2=end-left;if(len1>=k){return dfs(right,end,nums,k);}else if(len2>=k){return value;}else{return dfs(begin,left,nums,k-len2);}}
public:int findKthLargest(vector<int>& nums, int k) {return dfs(0,nums.size()-1,nums,k);}
};
类型二:归并排序
交易逆序对的总数
已解答
困难
相关标签
相关企业
在股票交易中,如果前一天的股价高于后一天的股价,则可以认为存在一个「交易逆序对」。请设计一个程序,输入一段时间内的股票交易记录
record
,返回其中存在的「交易逆序对」总数。示例 1:
输入:record = [9, 7, 5, 4, 6] 输出:8 解释:交易中的逆序对为 (9, 7), (9, 5), (9, 4), (9, 6), (7, 5), (7, 4), (7, 6), (5, 4)。
找出左区间和右区间的逆序对,并排序,在找左右区间结合的逆序对。
class Solution {vector<int>ret;int result=0;void dfs(vector<int>& nums,int begin,int end){if(begin>=end){return;}int middle=begin+(end-begin)/2;dfs(nums,begin,middle);dfs(nums,middle+1,end);int begin1=begin;int end1=middle;int begin2=middle+1;int end2=end;int i=0;while(begin1<=end1&&begin2<=end2){if(nums[begin1]<=nums[begin2]){ret[i++]=nums[begin1++];}else{result+=middle-begin1+1;ret[i++]=nums[begin2++];}}while(begin1<=end1){ret[i++]=nums[begin1++];}while(begin2<=end2){ret[i++]=nums[begin2++];}for(int i=begin;i<=end;i++){nums[i]=ret[i-begin];}}
public:int reversePairs(vector<int>& record) {ret.resize(record.size());dfs(record,0,record.size()-1);return result;}
};
七.链表
八.哈希表
字母异位词分组
已解答
中等
相关标签
相关企业
给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。
字母异位词 是由重新排列源单词的所有字母得到的一个新单词。
示例 1:
输入: strs =["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]示例 2:
输入: strs =[""]
输出: [[""]]示例 3:
输入: strs =["a"]
输出: [["a"]]
互为字⺟异位词的单词有⼀个特点:将它们「排序」之后,两个单词应该是「完全相同」的。 所以,我们可以利⽤这个特性,将单词按照字典序排序,如果排序后的单词相同的话,就划分到同⼀ 组中。排序后的string 作key,vector<string>作value
class Solution {
public:vector<vector<string>> groupAnagrams(vector<string>& strs) {unordered_map<string,vector<string>> hash;vector<vector<string>> ret;for(auto e:strs){string cur=e;sort(e.begin(),e.end());hash[e].push_back(cur);}for(auto e:hash){ret.push_back(e.second);}return ret;}
};
九.字符串
最长回文子串
已解答
中等
相关标签
相关企业
提示
给你一个字符串
s
,找到s
中最长的 回文 子串。示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。示例 2:
输入:s = "cbbd" 输出:"bb
特点:回文串从中心扩展俩边相同。主要的是有俩种扩展情况如:121 1221。
class Solution {int len=1;int start;void findlen(int left,int right,string&s){while(left>=0&&right<s.size()&&s[left]==s[right]){left--;right++;}if((right-left-1)>len){start=left+1;len=right-left-1;}}
public:string longestPalindrome(string s) {start=s.size()-1;if(s.size()==1){return s;}for(int i=0;i<s.size();i++){int left=i;int right=i+1;findlen(i,i+1,s);findlen(i-1,i+1,s);}return s.substr(start,len);}
};
高精度加法:
二进制求和
已解答
简单
相关标签
相关企业
给你两个二进制字符串
a
和b
,以二进制字符串的形式返回它们的和。示例 1:
输入:a = "11", b = "1" 输出:"100"示例 2:
输入:a = "1010", b = "1011" 输出:"10101"
class Solution {public:string addBinary(string a, string b) {int size1=a.size();int size2=b.size();int size=size1>size2?size1+1:size2+1;string ret(size,'0');int carry=0;for(int i=0;i<a.size()||i<b.size()||carry;i++){int char1=(i<a.size())?(a[a.size()-1-i]-'0'):0;int char2=i<b.size()?b[b.size()-1-i]-'0':0;int sum=char1+char2+carry;ret[size-1-i]=sum%2+'0';carry=sum/2;}if(ret[0]=='0'){ret.erase(0,1);} return ret;}
};
高进度乘法
字符串相乘
已解答
中等
相关标签
相关企业
给定两个以字符串形式表示的非负整数
num1
和num2
,返回num1
和num2
的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位 。
class Solution {
public:string multiply(string num1, string num2) {if(num1=="0"||num2=="0"){return "0";}reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());string ret="";int n=num1.size();int m=num2.size();vector<int> arr (m+n-1);for(int i=0;i<m;i++){int t1=num2[i]-'0';for(int j=0;j<n;j++){int t2=num1[j]-'0';arr[i+j]+=(t1*t2);}}int t=0;int i=0;while(i<m+n-1||t>0){if(i<m+n-1) {t+=arr[i];}char cur=(t%10)+'0';ret+=cur;i++;t=t/10;}reverse(ret.begin(), ret.end());return ret;}
};
十.栈
需要存储元素,元素后进先出。常用俩个栈,存不同类型的数据,再以特定规律用栈顶元素结合。
基本计算器 II
已解答
中等
相关标签
相关企业
给你一个字符串表达式
s
,请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。
你可以假设给定的表达式总是有效的。所有中间结果将在
[-231, 231 - 1]
的范围内。注意:不允许使用任何将字符串作为数学表达式计算的内置函数,比如
eval()
class Solution {
public:int calculate(string s) {vector<int> st; // ⽤数组来模拟栈结构int i = 0, n = s.size();char op = '+';while (i < n) {if (s[i] == ' ')i++;else if (s[i] >= '0' && s[i] <= '9'){// 先把这个数字给提取出来int tmp = 0;while (i < n && s[i] >= '0' && s[i] <= '9')tmp = tmp * 10 + (s[i++] - '0');if (op == '+')st.push_back(tmp);else if (op == '-')st.push_back(-tmp);else if (op == '*')st.back() *= tmp;elsest.back() /= tmp;} else {op = s[i];i++;}}int ret = 0;for (auto x : st)ret += x;return ret;}
};
字符串解码
已解答
中等
相关标签
相关企业
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为:
k[encoded_string]
,表示其中方括号内部的encoded_string
正好重复k
次。注意k
保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数
k
,例如不会出现像3a
或2[4]
的输入
class Solution {
public:string decodeString(string s) {vector<int> nums;vector<string> ss(1,"");int i=0;int n=s.size();while(i<n){if(s[i]<='9'&&s[i]>='0'){string tmp="";while(i<n&&s[i]<='9'&&s[i]>='0') tmp+=s[i++];nums.push_back((stoi(tmp)));}else if(s[i]=='['){string tmp="";i++;while(i<n&&s[i]>='a'&&s[i]<='z') tmp+=s[i++];ss.push_back(tmp);}else if(s[i]==']'){i++;int count=nums.back();nums.pop_back();string tmp=ss.back();ss.pop_back();string result="";while(count--){result+=tmp;}ss[ss.size()-1]+=result;}else{string tmp="";while(i<n&&s[i]>='a'&&s[i]<='z') tmp+=s[i++];ss[ss.size()-1]+=tmp;}}return ss[0];}
};
十一.队列+宽度搜索
N 叉树的层序遍历
已解答
中等
相关标签
相关企业
给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。
树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。
/*
// Definition for a Node.
class Node {
public:int val;vector<Node*> children;Node() {}Node(int _val) {val = _val;}Node(int _val, vector<Node*> _children) {val = _val;children = _children;}
};
*/class Solution {
public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;queue<Node*> q;if(root==nullptr){return ret;}q.push(root);int count=q.size();while(q.size()){vector<int> tmp ;while(count--){Node* head=q.front();vector<Node*> ch=head->children;if(ch.size()>0){for(auto &e:ch){q.push(e);}}tmp.push_back(head->val);q.pop();}ret.push_back(tmp);count=q.size(); }return ret;}
};
二叉树最大宽度
已解答
中等
相关标签
相关企业
给你一棵二叉树的根节点
root
,返回树的 最大宽度 。树的 最大宽度 是所有层中最大的 宽度 。
每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同,两端点间会出现一些延伸到这一层的
null
节点,这些null
节点也计入长度。题目数据保证答案将会在 32 位 带符号整数范围内
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int widthOfBinaryTree(TreeNode* root) {queue<pair<TreeNode*,long long>> q;q.push(make_pair(root,1));long long m=1;int count=1;while(q.size()){long long k=q.back().second-q.front().second+1;m=max(m,k);while(count--){TreeNode* head=q.front().first;int i=q.front().second;TreeNode* left_ch=head->left;if(left_ch!=nullptr){q.push(make_pair(left_ch,(long long)2*i));}TreeNode* right_ch=head->right;if(right_ch!=nullptr){q.push(make_pair(right_ch,(long long)2*i+1));}q.pop();}count=q.size();}return m;}
};
十二.堆
默认是大堆,要实现自定义排序,要自己实现比较器
前K个高频单词
已解答
中等
相关标签
相关企业
给定一个单词列表
words
和一个整数k
,返回前k
个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率, 按字典顺序 排序。
class Solution {
public:class cmp{public:bool operator()(const pair<string,int> &p1,const pair<string,int> &p2){if(p1.second!=p2.second){return p1.second>p2.second;}return p1.first<p2.first;}};vector<string> topKFrequent(vector<string>& words, int k) {unordered_map<string,int> hash;priority_queue<pair<string ,int>, vector<pair<string ,int>>, cmp>heap;for(auto &e:words){hash[e]++;}for(auto &e:hash){heap.push(e);if(heap.size()>k){heap.pop();}}vector<string> ret(k);for(int i = k - 1; i >= 0; i--){ret[i] = heap.top().first;heap.pop();}return ret;}
};
十三.bfs
fooldfill算法
岛屿的最大面积
已解答
中等
相关标签
相关企业
给你一个大小为
m x n
的二进制矩阵grid
。岛屿 是由一些相邻的
1
(代表土地) 构成的组合,这里的「相邻」要求两个1
必须在 水平或者竖直的四个方向上 相邻。你可以假设grid
的四个边缘都被0
(代表水)包围着。岛屿的面积是岛上值为
1
的单元格的数目。计算并返回
grid
中最大的岛屿面积。如果没有岛屿,则返回面积为0
。
class Solution {typedef pair<int,int> PII;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};int path;int m,n;
public:int maxAreaOfIsland(vector<vector<int>>& grid) {queue<PII> qu;m=grid.size();n=grid[0].size();int _max=0;path=0;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(grid[i][j]==1){path=1;qu.push({i,j});grid[i][j]=0;while(!qu.empty()){auto [a,b]=qu.front();qu.pop();for(int k=0;k<4;k++){int x=a+dx[k];int y=b+dy[k];if(x>=0&&x<m&&y>=0&&y<n&&grid[x][y]==1){qu.push({x,y});grid[x][y]='0';path++;}}}_max=max(_max,path);}}}return _max;}
};
最短路问题
就是指从入口到出口的借用路径的最短距离,需要注意的是入口和出口可以是位置和单词等各种东西。
迷宫中离入口最近的出口
已解答
中等
相关标签
相关企业
提示
给你一个
m x n
的迷宫矩阵maze
(下标从 0 开始),矩阵中有空格子(用'.'
表示)和墙(用'+'
表示)。同时给你迷宫的入口entrance
,用entrance = [entrancerow, entrancecol]
表示你一开始所在格子的行和列。每一步操作,你可以往 上,下,左 或者 右 移动一个格子。你不能进入墙所在的格子,你也不能离开迷宫。你的目标是找到离
entrance
最近 的出口。出口 的含义是maze
边界 上的 空格子。entrance
格子 不算 出口。请你返回从
entrance
到最近出口的最短路径的 步数 ,如果不存在这样的路径,请你返回-1
class Solution {
public:typedef pair<int, int> PII;int dx[4] = {0, 0, 1, -1};int dy[4] = {1, -1, 0, 0};int nearestExit(vector<vector<char>>& maze, vector<int>& entrance) {queue<PII> qu;int ret=1;int m = maze.size();int n = maze[0].size();qu.push({entrance[0], entrance[1]});maze[entrance[0]][entrance[1]]='0';while (!qu.empty()) {int count=qu.size();while(count--){auto [a, b] = qu.front();qu.pop();for (int k = 0; k < 4; k++) {int x = a + dx[k];int y = b + dy[k];if (x >= 0 && x < m && y >= 0 && y < n && maze[x][y] == '.') {if(x==m-1||x==0||y==n-1||y==0){return ret;}qu.push({x, y});maze[x][y] = '0';}}}ret++;}return -1;}};
十四 多源BFS
从多个起点开始扩散的bfs。
矩阵
已解答
中等
相关标签
相关企业
给定一个由
0
和1
组成的矩阵mat
,请输出一个大小相同的矩阵,其中每一个格子是mat
中对应位置元素到最近的0
的距离。两个相邻元素间的距离为
1
。
class Solution {public:typedef pair<int,int> PII;int n;int m;int dx[4]={1,-1,0,0};int dy[4]={0,0,1,-1};vector<vector<int>> updateMatrix(vector<vector<int>>& mat) {m=mat.size();n=mat[0].size();vector<vector<int>>ret(m,vector<int>(n,-1));queue<PII> q;for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(mat[i][j]==0){q.push({i,j});ret[i][j]=0;}}}while(q.size()){auto [a,b]=q.front();q.pop();for(int k=0;k<4;k++){int x=dx[k]+a;int y=dy[k]+b;if(x>=0&&x<m&&y>=0&&y<n&&mat[x][y]==1){mat[x][y]=-1;ret[x][y]=ret[a][b]+1;q.push({x,y});}}}return ret;}
};
BFS解决拓扑排序
流程:创建邻接表(或者邻接矩阵)和入度表,建图,拓扑排序。
课程表
已解答
中等
相关标签
相关企业
提示
你这个学期必须选修
numCourses
门课程,记为0
到numCourses - 1
。在选修某些课程之前需要一些先修课程。 先修课程按数组
prerequisites
给出,其中prerequisites[i] = [ai, bi]
,表示如果要学习课程ai
则 必须 先学习课程bi
。
- 例如,先修课程对
[0, 1]
表示:想要学习课程0
,你需要先完成课程1
。请你判断是否可能完成所有课程的学习?如果可以,返回
true
;否则,返回false
。
class Solution {
public:bool canFinish(int numCourses, vector<vector<int>>& prerequisites) {int n=numCourses;//1.邻接表和入度unordered_map<int,vector<int>> edges;vector<int> in(numCourses,0);//2.建图for(auto &e:prerequisites){int a=e[0];int b=e[1];//b->aedges[b].push_back(a);in[a]++;}//3.拓扑排序//(1).将入度为零的节点入队列queue<int> q;for(int i=0;i<n;i++){if(in[i]==0)q.push(i);}//(2).bfswhile(q.size()){int t=q.front();q.pop();//a.删除边for(auto e:edges[t]){in[e]--;if(in[e]==0){q.push(e);}}}for(auto &e:in){if(e!=0)return false;}return true;}
};
相关文章:
算法题型讲解
一.双指针 主要分为俩种类型: 1.左右指针:双指针指向开头,以一定标准移动或交换,对区域进行划分,或找到特殊点的位置 (如:快慢指针判断有无环,移动零) 2.对撞指针&am…...
Qt零散知识点
Qt零散知识点 Qt优点 跨平台接口简单,易上手一定程度上简化了内存的回收 Qt创建新项目 第一个窗口类默认的三个基类 QWidgetQMainWindowQDialog 其中QWidget是QMainWindow和QDialog的基类 一个Qt项目默认创建的文件 main.cpp 入口函数pro文件:工…...
算法导论(递归回溯)——⼆叉树中的深搜
算法思路(129) 前序遍历遵循“根节点、左子树、右子树”的顺序遍历二叉树的所有节点,常用于解决子节点状态依赖于父节点状态的问题。 算法思路: 在前序遍历的过程中,我们可以将信息从节点向左右子树传递,…...
UE像素流发布linux并进行容器化部署
一、宿主机软硬件要求 主要需要关注两部分:对像素流的支持、对linux容器的支持。 1、像素流要求: https://dev.epicgames.com/documentation/zh-cn/unreal-engine/unreal-engine-pixel-streaming-reference?application_version5.3 2、linux容器要求…...
arco-design-vue:给<a-table>组件每一行添加data-id属性,并根据id数组是否包含此行id进行样式处理
场景需求: 需要支持框选,框住的行需要更改背景色来标识选中了。如下图所示 【shiftq】表示【加入】,【shiftw】表示【移除】 拆分要实现的功能: 1.框选,选中行数据 2.选中行之后,当前行的样式要有所改变 …...
为什么ChatGPT选择SSE而非WebSocket?
为什么ChatGPT选择SSE而非WebSocket? 一、ChatGPT回答问题的技术逻辑 ChatGPT的响应生成基于Transformer架构和自注意力机制,其核心是通过概率预测逐词生成文本。当用户输入问题后,模型会先解析上下文,再通过预训练的庞大语料库…...
【论文精读与实现】EDC²-RAG:基于动态聚类的文档压缩方法提升检索增强生成RAG性能
🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创AI未来! 🚀 1. 论文核心思想 这篇由清华大学团队提出的EDC-RAG框架,针对当前…...
SAP S/4HANA Public Cloud的实施特点、项目阶段、资源和工具
1、SAP S/4HANA Public Cloud与OP、PCE部署的区别 近年来,SAP大力推广S/4HANA Public Cloud版本,越来越多的顾问开始接触SAP Public Cloud项目。S/4HANA Public Cloud强调标准化和简化,适合快速实施的企业,在实施方法、技术特点以及项目管理方法上,都与OP版本、PCE版本都…...
Kafka的生产者和消费者的关系
Apache Kafka 是一个分布式流处理平台,生产者和消费者是 Kafka 中两个核心角色,它们之间存在着紧密的关系,以下从多个方面为你详细介绍: 工作模式 生产者:负责将数据发送到 Kafka 的主题(Topic࿰…...
DAY01:【pytorch】张量
1、张量的简介 1.1 Variable Variable 是 torch.autograd 中的数据类型,主要用于封装 Tensor,进行自动求导 data:被包装的 Tensorgrad:data 的梯度grad_fn:创建 Tensor 的 Function,是自动求导的关键req…...
如何用VBA编辑器合并Word文档:详细教程
在实际办公中,我们经常需要将多个Word文档合并为一个。我将详细讲解如何通过VBA编辑器实现Word文档的自动合并。 前提:先将主文档另存为“docm宏格式”,将要合并的所有文档放在同一个文件夹内。 一、安装VBA编辑器 VBA编辑器是Word自带的工…...
智能体代理模式(Agent Agentic Patterns)深度解析
一、智能体代理模式的理论演进与核心定义 1.1 从自动化工具到认知代理的范式转变 传统AI系统以 规则驱动型工作流 为核心,依赖预设程序执行确定性任务(如制造业机器人)。而智能体(Agent)通过 大语言模型(…...
若依微服务集成Flowable仿钉钉工作流
项目简介 本项目工作流模块集成在若依项目单独一个模块,可实现单独运行部署, 前端采用微前端,嵌入在若依的前端项目中。因博主是后端开发,对前端不是太属性,没将工作流模块前端代码移到若依前端。下面贴上代码工程结构…...
关于数据结构B树部分的知识点,解题过程以及方法思路
关键点数和节点数的关系...
TOGAF之架构标准规范-技术架构
TOGAF是工业级的企业架构标准规范,本文主要描述技术架构阶段。 如上所示,技术架构(Technology Architecture)在TOGAF标准规范中处于D阶段 技术架构阶段 技术架构阶段的主要内容包括阶段目标、阶段输入、流程步骤、阶段输出、架构…...
经济金融优化:最优消费与投资分配的MATLAB实战
内容摘要 本文聚焦经济金融领域的优化问题,详细介绍最优消费和最优投资分配的理论与实践。 关键词:最优消费;最优投资分配;效用最大化;投资收益;MATLAB 一、引言 在经济金融领域,个体和企业常…...
【Python语言基础】17、继承
文章目录 1. 继承1.1 为什么要用继承1.2 继承的基本语法1.3 方法重写1.4 多重继承 2. supper()2.1 作用2.2 基本语法2.3 注意事项2.4 super() 在多继承中的特点 1. 继承 在 Python 里,继承是一种强大的编程概念,它允许一个类(子类࿰…...
基于CNN-GRU的深度Q网络(Deep Q-Network,DQN)求解移动机器人路径规划,MATLAB代码
一、深度Q网络(Deep Q-Network,DQN)介绍 1、背景与动机 深度Q网络(DQN)是深度强化学习领域的里程碑算法,由DeepMind于2013年提出。它首次在 Atari 2600 游戏上实现了超越人类的表现,解决了传统…...
DAY06:【pytorch】图像增强
1、基本概念 数据增强,又称数据增广、数据扩增,是对训练集进行变换,使训练集更丰富,从而让模型更具泛化能力 2、裁剪 — — Crop 2.1 transforms.CenterCrop 功能:从图像中心裁剪图片 size:所需裁剪图…...
K_KMS工具(适用windows和office)
目录 前言 一、下载 二、运行 前言 KMS工具(适用windows和office)。 一、下载 访问下载 💾下载👉工具下载地址:https://pan.quark.cn/s/bfdaa27ea823 二、运行 1、在下载目录中找到压缩包,并解压。 …...
Python Cookbook-5.12 检查序列的成员
任务 你需要对一个列表执行很频繁的成员资格检査。而in操作符的 O(n)时间复杂度对性能的影响很大,你也不能将序列转化为一个字典或者集合,因为你还需要保留原序列的元素顺序。 解决方案 假设需要给列表添加一个在该列表中不存在的元素。一个可行的方法…...
移动端六大语言速记:第13部分 - 网络与通信
移动端六大语言速记:第13部分 - 网络与通信 本文将对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言在网络与通信方面的特性,帮助开发者理解和掌握各语言的网络编程能力。 13. 网络与通信 13.1 HTTP请求 各语言HTTP请求实…...
kafka生产者partition数量和消费者数量的关系
在 Kafka 中,生产者的分区(Partition)数量和消费者数量之间存在着密切的关系,这种关系对 Kafka 集群的性能、数据处理的并行性以及负载均衡等方面都有着重要影响,以下为你详细介绍: 核心原则 Kafka 中每个…...
数据库主从复制学习笔记
目录 一、Binlog(Binary Log) 核心特性 核心用途 Binlog 格式(3种类型) 二、主从复制 核心原理 主库(Master) 从库(Slave) 配置步骤(以 MySQL 为例) …...
使用xml模板导出excel
下面这种表格如何使用xml导出呢? xml代码 <?xml version"1.0" encoding"UTF-8"?> <tables><styles><style id"h1" font.fontheightinpoints"14" font.fontname"黑体" alignment"c…...
深入解析栈式虚拟机与反向波兰表示法
1.1 什么是虚拟机? 虚拟机(Virtual Machine, VM)是一种软件实现的计算机系统,提供与物理计算机相类似的环境,但在软件层面运行。虚拟机的存在简化了跨平台兼容性、资源管理以及安全隔离等问题。 1.2 栈式虚拟机的架构…...
软件验收测试方法有哪些?验收测试报告如何获取?
大数据互联网时代,各种软件产品为我们的生活和工作带来了极大的便利,企业为了更好的保障软件产品质量,软件测试工作不可或缺。软件验收测试作为软件测试过程中的最后一个测试工作,也被称之为交付测试。验收测试主要是测试软件系统…...
Flexoo 柔性薄膜加热片技术全解析:从原理到应用优势
FLEXOO柔性薄膜加热片通过创新技术实现高效加热。它的柔性设计能够适配不同形状的表面,满足多种设备的需求。PTC加热技术让加热片具备自我调节功能,自动调整热输出以提升安全性与能效。固定功率加热技术则确保热量稳定输出,适合需要持续加热的场景。你可以依赖它的节能环保特…...
DeepSeek与搜索引擎:AI生成内容如何突破“语义天花板”
一、搜索引擎的“内容饥饿症”与AI的“产能悖论” 2024年,全球每天新增470万篇网络文章,但搜索引擎的索引拒绝率高达68%。这一矛盾的根源在于:算法对“高质量原创”的定义已从“形式独特性”转向“认知增值性”。传统AI生成内容(…...
【1】k8s集群管理系列--包应用管理器之helm
一、helm概述 Helm核心是模板,即模板化K8s YAML文件。 通过模板实现Chart高效复用,当部署多个应用时,可以将差异化的字段进行模板化,在部署时使用-f或 者–set动态覆盖默认值,从而适配多个应用 helm工作流程…...
【零基础玩转多模态AI:Gemma3 27B开源视觉模型本地部署与远程访问】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
安全岗の夺命连环问:(第壹篇)从XSS到0day的灵魂拷问
终极目录 一、面试官の死亡凝视:"给我手撕一个反射型XSS!" 1.1 菜鸟の陨落:那些年我们写过的致命代码 1.2 渗透艺术:如何用XSS实现CSRF联动攻击 1.3 防御矩阵:OWASP ESAPI的十八层净化 二、血泪实战&am…...
IAP Firmware Upload Tools.exe IAP 网络固件升级教程
IAP是In Application Programming的简写,IAP升级可以被视为固件升级的一种形式,它是一种在应用程序运行过程中对固件进行更新的技术手段。允许MCU在运行过程中对MCU User Flash的部分区域进行烧写,目的是为了代替编程器对MCU烧录的依赖。 主程序UI 软件按钮说明&a…...
Redis 7高性能缓存与分布式架构实战
大家好,我是袁庭新。很高兴向大家推荐我的新课《Redis 7高性能缓存与分布式架构实战》。这套课程是我与两位一线大厂的高级开发工程师朋友共同研发的,他们分别来自华为和美团,拥有丰富的实战经验。我将担任课程的主讲,为大家带来全…...
自动驾驶时间同步
主要包含两个大的概念:时间系统间的时间同步与传感器数据间的时间同步 1. 时间系统间的时间同步 概念: 自动驾驶域控一般由多个芯片与多种类型的传感器组成,如:MCU SoC Camera Lidar Radar USS GNSS,其中 MCU…...
CISA关键措施要求解析:提升组织网络安全的实用指南
1. 引言 在当今日益复杂的网络安全环境中,组织面临着前所未有的挑战。美国网络安全与基础设施安全局(CISA)提出的关键措施要求,为组织提供了一个全面的框架来加强其网络安全态势。本文将深入探讨这些措施,并提供实际的实施建议。 2. CISA关键措施概述 CISA关键措施包括以下几…...
java笔记03
基本数据类型 数据值是存储在自己的空间中。 特点:赋值给其他变量,也是赋的真实的值。 引用数据类型 数据值是存储在其他空间中,自己空间中存储的是地址值。 特点:赋值给其他变量,赋的地址值。 综合练习 使用 ctrl…...
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器
【HarmonyOS 5】鸿蒙的装饰器原理和自定义装饰器 一、鸿蒙中的装饰器是什么? 在ArkTS中装饰器(Decorator)是一种特殊的声明,能够对类、方法、属性等进行标注和修改。 因为ArkTS 是TypeScript 扩展而来的编程语言,Ty…...
【Java学习】AI时代下如何学习Java语言开发
学习 Java 语言开发时,合理借助 AI 工具可以提升效率、深化理解,以下是具体的学习策略和方法: 一、利用 AI 辅助基础学习 1. 智能文档解读与语法解析 工具:ChatGPT、Bing Chat、Google Bard用法: 直接提问基础语法问…...
dd命令刻录CENT OS10 (.iso)光盘镜像文件到U盘
操作系统 | “扇区”、“簇”、“块”、“页”等概念_文件系统的簇和扇区-CSDN博客 Windows下面的DD工具_windows dd工具-CSDN博客 如何用 ISO 镜像制作 U 盘安装盘(通用方法、无需 WinPE)_isou-CSDN博客 1 到CENT OS 网站download iso光盘镜像文件 ht…...
2025年常见渗透测试面试题- Java考察(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 Java考察 一、Java MVC架构与数据流向 二、Java沙箱安全机制 三、iBATIS参数化查询与注入防御 四、…...
MySQL:事务的理解
一、CURD不加控制,会有什么问题 (1)因为,MySQL里面存的是数据,所以很有可能会被多个客户访问,所以mysqld可能一次会接受到多个关于CURD的请求。(2)且mysql内部是采用多线程来完成数…...
开源推荐#5:CloudFlare-ImgBed — 基于 CloudFlare Pages 的开源免费文件托管解决方案
大家好,我是 jonssonyan。 寻找一个稳定、快速、还最好是免费或成本极低的图床服务,一直是许多开发者、博主和内容创作者的痛点。公共图床可能说关就关,付费服务又增加成本。现在,一个名为 CloudFlare-ImgBed 的开源项目…...
[设计模式]发布订阅者模式解耦业务和UI(以Axios拦截器处理响应状态为例)
当前的代码使用了多个if-else分支来处理不同的状态码,这会导致代码耦合度高,难以维护和扩展。比如,如果未来要新增一个状态码的处理,就需要修改原有的拦截器代码,这违反了开闭原则。发布订阅模式可以将不同状态码的处理逻辑解耦,每个状态码对应一个订阅者,通过中间件来管…...
Redis的过期和内存淘汰策略
文章目录 惰性删除定期删除内存满了,数据淘汰策略 Redis 提供了两种删除策略: 惰性删除 、定期删除 惰性删除 定期删除 两种清除模式: 内存满了,数据淘汰策略 Redis 提供了八种数据淘汰策略: 1. 默认是不淘汰任何的 key&#x…...
每日一题-力扣-2999. 统计强大整数的数目 0410
2999. 统计强大整数的数目 问题分析 题目描述 题目要求统计区间 [start, finish] 内的强大整数数量。强大整数需满足以下条件: 每位数字不超过 limit以字符串 s 作为后缀关键要点理解 强大整数的定义:整数的每一位都不超过 limit,且必须以字符串 s 结尾。区间计数:需要统…...
Flink回撤流详解 代码实例
一、概念介绍 1. 回撤流的定义 在 Flink 中,回撤流主要出现在使用 Table API 或 SQL 进行聚合或更新操作时。对于那些结果并非单纯追加(append-only)的查询,Flink 会采用“回撤流”模式来表达更新。 回撤流的数据格式ÿ…...
学习笔记四——Rust 函数通俗入门
🦀 Rust 函数通俗入门 📘 Rust 是一门语法精炼但设计严谨的系统级语言。本文围绕函数这一主线,带你真正搞懂 Rust 最关键的语法思想,包括表达式驱动、闭包捕获、Trait 限制、生命周期标注与所有权规则,每遇到一个新概念…...
使用 Spring Boot 和 Uniapp 搭建 NFC 读取系统
目录 一、NFC 技术原理大揭秘1.1 NFC 简介1.2 NFC 工作原理1.3 NFC 应用场景 二、Spring Boot 开发环境搭建2.1 创建 Spring Boot 项目2.2 项目基本配置 三、Spring Boot 读取 NFC 数据3.1 NFC 设备连接与初始化3.2 数据读取逻辑实现3.3 数据处理与存储 四、Uniapp 前端界面开发…...
五、中断系统及外部中断
中断系统是管理和执行中断的逻辑结构;外部中断是众多能产生中断的外设之一; 一、中断系统 1.中断的概念 在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序ÿ…...