反转字符串 reverse(s.begin()+l,s.begin()+r+1);
从l到r的反转 r+1才行
s.erase(s.begin()+l); 删除一个字符的
leetcode 151. 反转字符串中的单词 主要是不占用额外空间
思路:先反转整个字符串 再去除前后,和中间冗余的空格,再挨个反转单词
#128 最长连续序列 哈希解决
把数组转存到 set/unordered_set 中
auto v : m
m.erase(key)
m.find(key)
m.count(key)//
set是有序的 / unordered_set 是无序的
因此 unordered 添加删除是 常数复杂度
set是logn复杂度
class Solution {
public:
ListNode* sortList(ListNode* head) {
if(!head || !head->next) return head;
ListNode* s=head;
int len=1;
while(s->next){s=s->next;len++;}
for(int i=1;i<len;i*=2){
s=new ListNode(0);
ListNode* a=head,*b=head,*tmp=s;
int step=ceil(0.5*len/i);
cout<<i<< "i,step "<<step<<len<<endl;
for(int k=0;k<step;k++){
ListNode * v=s->next;
for(int j=0;j<k*i;j++)v=v->next;
a=v,b=v;
cout<<a->val;
int p=0,q=0;
for(int y=i;y>0;y--) if(b && b->next) b=b->next; else b=NULL;
for(int x=i*2;x>0;x--){
if(b) cout<<a->val<<" a,b "<<b->val<<endl;
else cout<<"no b"<<endl;
if(!b || ( p<i && a->val <= b->val) || q==i) {tmp->next=a; a=a->next; p++; }
else {tmp->next=b; b=b->next; q++; }
tmp=tmp->next;
if(p==i && !b) break;
}
ListNode *vv=s->next;
while(vv){cout<<vv->val<<endl; vv=vv->next;}
}
}
return s->next;
}
};
排序链表一定要会做!字节之前都考过 一次了 感觉秋招是逃不过滴!
class Solution {
public://字典 先修课程,和他们的数量
bool canFinish(int nums, vector<vector<int>>& pre) {
vector <int> in(nums,0);//记录 入度
vector<vector<int>> graph(nums);
for(int i=0;i<pre.size();i++){
int a=pre[i][0],b=pre[i][1];
++in[a];
graph[b].push_back(a);
}
int vis=0;
queue<int> q;
for(int i=0;i<nums;i++) if(in[i]==0) q.push(i);
while(!q.empty()){
int cur=q.front(); q.pop(); vis++;
for (auto &next:graph[cur]){
if(--in[next]==0) q.push(next);
}
}
return vis==nums;
}
};
树形dp
子结构是一棵子树
通过dfs遍历树 并且后序(遍历过叶子结点后再根据叶子结点)改变dp数组大小