标签:26 hit level int tr next num 2022.7 LeetCode
LeetCode
实现跳表
主要参考了以下几篇Bolg:
https://www.acwing.com/blog/content/15081/
https://www.jianshu.com/p/9d8296562806
https://www.acwing.com/blog/content/4863/
https://www.luogu.com.cn/blog/your-alpha1022/SkipList
class Skiplist {
public:
const static int MAX_LEVEL = 16, INF = 30010, N = 50010;
float ratio = 0.5;
struct Node {
int down = 0, next = 0, val, maxLevel = 0;
void init(int _val, int _maxLevel, int _down, int _next) {
down = _down, val = _val, maxLevel = _maxLevel, next = _next;
}
};
int idx = 0, head, nodes[N], tt = -1;
Node tr[N];
Skiplist() {
tr[0].init(INF, 0, 0, 0);
int u = head = getNode();
tr[u].init(-INF, MAX_LEVEL, 0, 0);
for (int i = MAX_LEVEL - 1; i > 0; i--) {
int v = getNode();
tr[u].down = v;
tr[v].init(-INF, i, 0, 0);
u = v;
}
}
int getNode() {
if (tt < 0)
nodes[++tt] = ++idx;
int u = nodes[tt--];
return u;
}
void gcNode(int u) {
nodes[++tt] = u;
}
int update[MAX_LEVEL + 1];
int searchHit(int num) {
int u = head, hit = 0, p;
for (int level = MAX_LEVEL; level > 0; level--) {
p = u;
while (tr[p].val < num)
u = p, p = tr[p].next;
if (tr[p].val == num)
hit = max(level, hit);
update[level] = u;
u = tr[u].down;
}
return hit;
// 返回索引所在层级
}
bool search(int target) {
return searchHit(target);
}
void add(int num) {
searchHit(num);
int last = 0, randLevel = randomLevel(), t, c, u;
for (int level = randLevel; level > 0; level--) {
u = getNode();
Node &node = tr[u];
node.init(num, level, 0, 0);
c = update[level];
t = tr[c].next;
tr[c].next = u, node.next = t;
if (last)
tr[last].down = u;
last = u;
}
}
bool erase(int num) {
int hit = searchHit(num);
if (!hit)
return false;
int p, t;
for (int level = hit; level > 0; level--) {
p = update[level];
t = tr[p].next;
tr[p].next = tr[t].next;
gcNode(t);
}
return true;
}
int randomLevel() {
int level = 0;
while (rand() % 100 < ratio * 100 && level < MAX_LEVEL) {
level ++;
}
return level + 1;
}
};
Acwing
模拟
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int T;
int n, k;
int w[N];
int main() {
cin >> T;
for (int ct = 1; ct <= T; ct++) {
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> w[i];
}
int ans = 0;
for (int i = n; i >= k; ) {
if (w[i] == 1) {
int t = 1;
while (w[i] == t && t <= k) {
i--;
t++;
}
if (t == k + 1) {
ans++;
}
} else {
i--;
}
}
cout << "Case #" << ct << ": " << ans << endl;
}
return 0;
}
标签:26,hit,level,int,tr,next,num,2022.7,LeetCode 来源: https://www.cnblogs.com/superPG/p/16519947.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。