lcr107
多源bfs
注意init ret -1防重复入队
++if(x>=0 && x<m && y>=0 && y<n && ret[x][y] == -1)
// 最近距离 = 相邻0的距离 + 1
ret[x][y] = ret[a][b] + 1;++
class Solution {
typedef pair<int,int> pii;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
public:
vector<vector<int>> updateMatrix(vector<vector<int>>& mat)
{
queue<pii> q;
int m=mat.size(),n=mat[0].size();
vector<vector<int>> ret(m,vector<int>(n,0));
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(mat[i][j]==0)
{
q.push({i,j});
}
else
{
// 标记未处理的1为-1
ret[i][j] = -1;
}
}
}
while(!q.empty())
{
auto [a,b] = q.front();
q.pop();
for(int k=0;k<4;k++)
{
int x=a+dx[k],y=b+dy[k];
++if(x>=0 && x<m && y>=0 && y<n && ret[x][y] == -1)
{
// 最近距离 = 相邻0的距离 + 1
ret[x][y] = ret[a][b] + 1;++
q.push({x,y});
}
}
}
return ret;
}
};
lcr17
滑动窗口+两个哈希表
在s里找包含t所有字符的最短子串,找不到就返回空
class Solution {
public:
string minWindow(string s, string t) {
unordered_map<char, int> tag;
unordered_map<char, int> hash;
for (char c : t) {
tag[c]++;
}
int cnt = 0;
int tcnt = t.size();
int l = 0, r = 0;
int minLen = INT_MAX;
int start = 0;
int n = s.size();
while (r < n) {
char c = s[r];
hash[c]++;
if (hash[c] <= tag[c]) {
cnt++;
}
r++;
while (cnt == tcnt)
{
++if (r - l < minLen) {++
++minLen = r - l;++
++start = l;++
}
char leftChar = s[l];
++hash[leftChar]--;++
++if (hash[leftChar] < tag[leftChar])++
++cnt--;++
l++;
}
}
return minLen == INT_MAX ? "" : s.substr(start, minLen);
}
};
lc1186

class Solution {
public:
int maximumSum(vector<int>& arr) {
int n=arr.size();
bool flag=false;
int maxNum=INT_MIN;
for(int i=0;i<n;i++){
if(arr[i]>0){
flag=true;
break;
}
maxNum=max(maxNum,arr[i]);
}
if(flag==false)return maxNum;
vector<int>pre(n+2),nex(n+2);
int add=0;
for(int i=1;i<=n;i++){
add+=arr[i-1];
++if(add<arr[i-1]) add=arr[i-1];++
++pre[i]=add>0?add:0;++
}
add=0;
for(int i=n;i>=1;i--){
add+=arr[i-1];
if(add<arr[i-1])add=arr[i-1];
nex[i]=add>0?add:0;
}
int ans=INT_MIN;
for(int i=1;i<=n;i++){
++ans=max(max(ans,pre[i-1]+nex[i+1]+arr[i-1]),pre[i-1]+nex[i+1]);++
}
return ans;
}
};