bfs|栈

lc1885

满足 di + dj > 0 的 dj 的最小阈值 target (即 -di + 1 )

lower_bound 找到 d 数组中++从 i+1 位置开始第一个大于等于 target 的元素位置++

数组末尾位置减去该位置得到满足条件的 j 的数量,最后累加到结果中

typedef long long ll;

class Solution {

public:

long long countPairs(vector<int>& nums1, vector<int>& nums2)

{

int n = nums1.size();

vector<int> d(n);

for (int i = 0; i < n; ++i) {

di = nums1i - nums2i;

}

sort(d.begin(), d.end());

ll ret = 0;

for (int i = 0; i < n; ++i) {

int target = -di + 1;

int cnt = d.end() - lower_bound(d.begin() + i + 1, d.end(), target);

ret += cnt;

}

return ret;

}

};

lc1018

class Solution {

public:

vector<bool> prefixesDivBy5(vector<int>& nums)

{

int n = nums.size();

vector<bool> ret(n, false);

int num = 0;

for (int i = 0; i < n; i++)

{

num = (num << 1) + numsi;

if (num % 5 == 0)

reti = true;

// 防止num过大溢出,对5取余不影响结果,因为++(a*2 + b) % 5 = ((a%5)*2 + b) % 5
num %= 5;
++

}

return ret;

}

};

lc1950

单调栈遍历数组,计算每个位置作为最小值时的区间长度

记录对应区间的最大最小值

再通过 *++倒序更新++*得到每个长度下的最大最小值

class Solution {

public:

vector<int> findMaximums(vector<int>& nums) {

int n = nums.size();

//求左右延拓长度,并完成初始化更新

stack<int> sta;

sta.push(-1);

vector<int> ans(n, 0);

for(int i = 0; i < n; ++i){

while(sta.top() != -1 && numssta.top() > numsi){

int mi = numssta.top();

sta.pop();

ansi - sta.top() - 2 = max(ansi - sta.top() - 2, mi);

}

sta.push(i);

}

while(sta.top() != -1){

int mi = numssta.top();

sta.pop();

ansn - sta.top() - 2 = max(ansn - sta.top() - 2, mi);

}

// 倒序更新

for(int i = n - 2;i >= 0; i--){

ansi = max(ansi, ansi + 1);

}

return ans;

}

};

画图理清思路 用算法实现出来

lc484

反转连续的D区间

class Solution {

public:

vector<int> findPermutation(string s) {

int n=s.size()+1;

vector<int>ans(n,0);

for(int i=0;i<n;i++)ansi=i+1;

int i=0;

while(i<n){

if(si=='D'){

int j=i+1;

while(j<n&&sj=='D'){

j++;

}

int len=j-i;

++reverse(ans.begin()+i,ans.begin()+i+len+1);++

++//+1多反转一个++

i=j; //i移到下一个非d的地方

}

else i++;

}

return ans;

}

lc340

滑窗

class Solution {

public:

int lengthOfLongestSubstringKDistinct(string s, int k) {

int n=s.size();

unordered_map<char,int> hash;

int cnt=1,l=0,ret=1;

if(k==0) return 0;

hashs\[0]++;

for(int i=1;i<n;i++)

{

if(!hash.count(si))

cnt++;

hashs\[i]++;

while(cnt>k)

{

if(--hashs\[l]==0)

{

cnt--;++hash.erase(sl);++

}

l++;

}

ret=max(ret,i-l+1);

}

return ret;

}

};

lc505

if (p+add<visnxny)

visnxny = p+add;

//update

q.push({nx, ny,p+add})

BFS结合距离记录机制,沿四个方向滚动到底的方式探索迷宫路径

dist数组维护各位置最短距离,仅当新路径更短时更新入队

class Solution

{

int dx4={1,-1,0,0};

int dy4={0,0,1,-1};

typedef tuple<int,int,int> tiii;

public:

int shortestDistance(vector<vector<int>>& maze, vector<int>& start, vector<int>& destination)

{

int m = maze.size(), n = maze0.size();

vector<vector<int>> vis(m, vector<int>(n, INT_MAX));

queue<tiii> q;

q.push({start0, start1, 0});

visstart\[0]start\[1] = 0;

int ret=INT_MAX;

while (!q.empty()) {

auto x, y,p = q.front();

q.pop();

if (x == destination0 && y == destination1) {

ret=min(ret,p);

}

for (int k = 0; k < 4; ++k) {

int add=0;

int nx = x, ny = y;

// 沿当前方向滚动到底

while (nx + dxk >= 0 && nx + dxk < m && ny + dyk >= 0 && ny + dyk < n && mazenx + dx\[k]ny + dy\[k] == 0) {

nx += dxk;

ny += dyk;

add++;

}

if (p+add<visnxny) {

visnxny = p+add;

//update

q.push({nx, ny,p+add});

}

}

}

return ret==INT_MAX?-1:ret;

}

};

相关推荐
小欣加油6 小时前
leetcode56 合并区间
c++·算法·leetcode·职场和发展
lqqjuly7 小时前
前沿算法深度解析(二)
人工智能·算法·机器学习
徐小夕8 小时前
万字长文!千万级文档 RAG 知识库系统落地实践
前端·算法·github
akunkuntaimei8 小时前
2026年高考数学各省真题及答案(完整版)
算法·高考
Hello:CodeWorld9 小时前
C 风格变参 vs C++ 变参模板:核心区别与选型指南
c语言·c++·算法
8Qi810 小时前
LeetCode 516:最长回文子序列
算法·leetcode·职场和发展·动态规划
youngerwang11 小时前
【从搬运工到协处理器:网卡芯片架构、算法、验证与边缘演进深度剖析】
网络·算法·架构·芯片
KaMeidebaby12 小时前
卡梅德生物技术快报|纯化重组蛋白实操详解
人工智能·python·tcp/ip·算法·机器学习
手写码匠12 小时前
从零实现 Prompt 工程引擎:结构化提示、自动优化与多轮自省体系
人工智能·深度学习·算法·aigc
无限码力13 小时前
阿里算法岗 0530笔试真题 - 多约束条件下的元素匹配统计
算法·阿里笔试真题·阿里机试真题·阿里算法岗笔试