第一周
1029 可被五整除的二进制前缀
每次循环将前缀乘以二即可
题型:数学
class Solution {
public:
vector<bool> prefixesDivBy5(vector<int>& A) {
vector<bool> ans(A.size(),false);
int pre=0;
for(int i=0;i<A.size();++i){
pre=pre*2+A[i];
pre%=10;
if(pre%5==0)ans[i]=true;
}
return ans;
}
};
1030 链表中的下一个最大节点
要求O(n)解决,搜了一下才知道单调栈....,如果下一个数小于栈顶的数,将这个数入栈,否则将前面的全部pop。
题型:单调栈
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> nextLargerNodes(ListNode* head) {
vector<int> save;
stack<int> s;
ListNode* Node=head;
while(Node!=NULL){
save.push_back(Node->val);
Node=Node->next;
}
vector<int> ans(save.size(),0);
s.push(0);
for(int i=1;i<save.size();++i){
while(!s.empty()&&save[i]>save[s.top()]){
ans[s.top()]=save[i];
s.pop();
}
s.push(i);
}
return ans;
}
};
1031 飞驰的数量
dfs解决即可,每次dfs传入一个flag的引用,如果碰到边界,flag置为true。
题型:搜索
class Solution {
public:
bool vis[500][500];
int cnt;
void dfs(int x,int y,bool& flag,vector<vector<int>>& A){
if(x==0||y==0||x==A.size()-1||y==A[0].size()-1)flag=true;
for(int i=-1;i<=1;++i){
for(int j=-1;j<=1;++j){
if((i+j==1||i+j==-1)&&x+i>=0&&x+i<A.size()&&y+j>=0&&y+j<A[0].size()){
if(A[x+i][y+j]==1&&!vis[x+i][y+j]){
vis[x+i][y+j]=true;
cnt++;
dfs(x+i,y+j,flag,A);
}
}
}
}
}
int numEnclaves(vector<vector<int>>& A) {
int num=0;
for(int i=0;i<A.size();++i){
for(int j=0;j<A[0].size();++j){
if(A[i][j]==1&&!vis[i][j]){
vis[i][j]=true;
cnt=1;
bool flag=false;
dfs(i,j,flag,A);
if(!flag)num+=cnt;
}
}
}
return num;
}
};
第二周
5016 删除最外层的括号
用栈即可,当栈为空时不将那个括号加入ans
class Solution {
public:
string removeOuterParentheses(string S) {
string ans;
stack<char> st;
for(int i=0;i<S.size();++i){
if(S[i]=='('){
if(!st.empty())ans+='(';
st.push('(');
}
else if(S[i]==')'){
st.pop();
if(!st.empty()){
ans+=')';
}
}
}
return ans;
}
};
5017 从根到叶的二进制数之和
简单的dfs
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
int sum=0;
void dfs(TreeNode* node,int num){
if(node->left==NULL&&node->right==NULL){
sum+=num;
sum%=1000000007;
return;
}
if(node->left!=NULL)dfs(node->left,(num*2+node->left->val)%1000000007);
if(node->right!=NULL)dfs(node->right,(num*2+node->right->val)%1000000007);
}
int sumRootToLeaf(TreeNode* root) {
dfs(root,root->val);
return sum;
}
};
5018 驼峰式匹配
双指针。当出现queries大写字母且不匹配时直接返回false。当pattern的指针到达尾部且已经匹配时,若再出现大写字母直接返回false。若某一个字母匹配成功则ptr++
class Solution {
public:
bool ishigh(char x){
return x>='A'&&x<='Z';
}
vector<bool> camelMatch(vector<string>& queries, string pattern) {
vector<bool> ans(queries.size(),true);
for(int i=0;i<queries.size();++i){
int ptr=0;
bool flag=false;
for(int j=0;j<queries[i].size();++j){
if(ishigh(queries[i][j])&&pattern[ptr]!=queries[i][j]){
ans[i]=false;
break;
}
if(queries[i][j]==pattern[ptr]){
if(flag&&ishigh(queries[i][j])){
ans[i]=false;
break;
}
if(ptr<pattern.size()-1)ptr++;
else flag=true;
}
}
if(!flag)ans[i]=false;
}
return ans;
}
};
5019 视频拼接
不会,等答案ing
网友评论