01bfs|前缀和的前缀和

单增栈 维护 子数组最小值 左右边界

lc2281

单调栈+前缀和的前缀和+贡献法

计算数组中所有连续子数组的总力量和:每个子数组的总力量 = 子数组里的最小值 × 子数组的元素和,最后把++所有子数组的总力量相加++

单增栈确定++每个元素作为子数组最小值的左右边界++

结合++前缀和的前缀和快速计算子数组强度总和++

最终累加所有元素的贡献得到结果并取模

class Solution {

public:

int totalStrength(vector<int>& strength)

{

const int MOD = 1'000'000'007;

int n = strength.size();

vector<int> left(n, -1);

vector<int> right(n, n);

stack<int> st;

st.push(-1); // 哨兵,方便计算 left[i]

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

while (st.size() > 1 && ++strength[st.top()] >= strength[i]) {
right[st.top()] = i;
++

st.pop();

}

left[i] = st.top();

st.push(i);

}

////////////////////////

long long s = 0; // 前缀和

vector<int> ss(n + 2); // 前缀和的前缀和

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

s += strength[i - 1];

ss[i + 1] = (ss[i] + s) % MOD;

// 子数组 元素和的元素和

}

long long ans = 0;

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

long long l = left[i] + 1, r = right[i] - 1; // [l,r] 左闭右闭

++long long tot = ((i - l + 1) * (ss[r + 2] - ss[i + 1]) - (r - i + 1) * (ss[i + 1] - ss[l])) % MOD;++

ans = (ans + strength[i] * tot) % MOD; // 累加贡献

}

return (ans + MOD) % MOD;

}

};

lc2290

0-1 BFS,双端队列处理网格移动代价

无障碍(代价0)节点入队首、有障碍(代价1)节点入队尾

求解从网格起点到终点的最小障碍移除数量

喵喵dj版(遇到0就addFirst,优先走短路,0-1BFS通过可插双端队列的队首省了优先队列的排序log,极大地优化了时间复杂度

++if (dis[i][j] + g < dis[x][y])++

dis[x][y] = dis[i][j] + g; //update

++g == 0 ? q.emplace_front(x, y) : q.emplace_back(x, y);++

class Solution {

static constexpr int DIRS[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}};

public:

int minimumObstacles(vector<vector<int>> &grid) {

int m = grid.size(), n = grid[0].size();

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

dis[0][0] = 0;

deque<pair<int, int>> q;

q.emplace_front(0, 0);

while (!q.empty()) {

auto [i, j] = q.front();

q.pop_front();

for (auto& [dx, dy] : DIRS) {

int x = i + dx, y = j + dy;

if (0 <= x && x < m && 0 <= y && y < n) {

int g = grid[x][y];

++if (dis[i][j] + g < dis[x][y]) {++

dis[x][y] = dis[i][j] + g; //update

++g == 0 ? q.emplace_front(x, y) : q.emplace_back(x, y);++

}

}

}

}

return dis[m - 1][n - 1];

}

};

计算新路径的障碍代价,++若新代价更小则更新最短障碍数++

最后根据位置是否为障碍,将节点分别插入双端队列的队首(空地)或队尾(障碍),以此实现0-1 BFS的核心逻辑

相关推荐
wen__xvn7 小时前
代码随想录算法训练营DAY11第五章 栈与队列part02
算法
春日见8 小时前
控制算法:PP(纯跟踪)算法
linux·人工智能·驱动开发·算法·机器学习
智者知已应修善业8 小时前
【编写函数求表达式的值】2024-4-3
c语言·c++·经验分享·笔记·算法
sinat_286945198 小时前
opencode
人工智能·算法·chatgpt
工口发动机8 小时前
ABC440DEF简要题解
c++·算法
C++ 老炮儿的技术栈8 小时前
什么是通信规约
开发语言·数据结构·c++·windows·算法·安全·链表
零小陈上(shouhou6668889)9 小时前
K-近邻算法 - lazy learning的代表
算法·近邻算法
有一个好名字9 小时前
力扣-从字符串中移除星号
java·算法·leetcode