bfs|红黑树multiset
lc480
滑动窗口结合有序集合(multiset_红黑树)维护窗口内元素
指针定位中间位置,动态插入新元素、删除窗口外元素并调整中间指针
最终计算每个窗口的中位数并返回

class Solution {
public:
vector<double> medianSlidingWindow(vector<int>& nums, int k) {
vector<double> result;
multiset<int> window(nums.begin(), nums.begin() + k);
auto mid = next(window.begin(), k / 2);
for (int i = k; ; ++i)
{
//红黑树迭代器取中点
result.push_back((double(*mid) + *prev(mid, 1 - k % 2)) / 2);
if (i == nums.size())
return result;
//红黑树维护窗口
window.insert(nums[i]);
//动态维护mid
if (nums[i] < *mid) --mid;
if (nums[i - k] <= *mid) ++mid;
window.erase(window.lower_bound(nums[i - k]));
}
}
};
lc1091
class Solution
{
typedef pair<int,int> pii;
int dx[8]={-1,-1,-1,0,0,1,1,1};
int dy[8]={-1,0,1,-1,1,-1,0,1};
public:
int shortestPathBinaryMatrix(vector<vector<int>>& grid)
{
int m=grid.size(),n=grid[0].size();
if(grid[0][0]==1) return -1;
int ret=0;
queue<pii> q;
vector<vector<bool>> vis(m,vector<bool>(n,false));
q.push({0,0});
vis[0][0]=true;
while(q.size())
{
int sz=q.size();
ret++;
while(sz--)
{
auto [a,b]=q.front();
q.pop();
if(a==m-1 && b==n-1)
return ret;
for(int i=0;i<8;i++)
{
int x=a+dx[i],y=b+dy[i];
if(x>=0 && y>=0 && x<m && y<n && !vis[x][y] && grid[x][y]==0)
{
q.push({x,y});
vis[x][y]=true;
}
}
}
}
return -1;
}
};
