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;

}

};

相关推荐
m沐沐6 小时前
【深度学习】YOLOv2目标检测算法——改进点、网络结构与聚类先验框解析
人工智能·pytorch·深度学习·算法·yolo·目标检测·transformer
不会就选b6 小时前
算法日常・每日刷题--<链表>3
数据结构·算法·链表
geovindu7 小时前
go: Iterative Algorithms
开发语言·后端·算法·golang·迭代算法
Zachery Pole9 小时前
CCF-CSP备战NO.7【队列】
算法
闪电悠米9 小时前
力扣hot100-48.旋转图像-转置翻转详解
算法·leetcode·职场和发展
满天星83035779 小时前
【算法】最长递增子序列(三种解法)
算法
啦啦啦啦啦zzzz10 小时前
算法:贪心算法
c++·算法·leetcode·贪心算法
清泓y12 小时前
RAG 技术
算法·ai
阿慧今天瘦了嘛12 小时前
计算机组成原理概述:从硬件到软件的桥梁
计算机网络·算法
网站优化(SEO)专家12 小时前
SEO核心算法拆解:网站排名快速提升的武林秘籍!
算法·搜索引擎·网站排名·核心算法