链接:九章算法 - 帮助更多程序员找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧
复杂链式结构:跳表_INGNIGHT的博客-CSDN博客:块状链表
class Solution {
private:
class BlockManager {
struct Block {
int total;
std::vector<int> count;
Block(int block_size):total(0) {
count.resize(block_size);
}
};
public:
BlockManager(int capicaty) {
_block_size = sqrt(capicaty);
int block_count = capicaty / _block_size;
_blocks.reserve(block_count);
for (int i = 0; i < block_count; ++i) {
_blocks.emplace_back(Block(_block_size));
}
}
private:
std::vector<Block> _blocks;
int _block_size;
public:
int get_count(int val) {
int index = val / _block_size;
int offset = val % _block_size;
int count = 0;
for (int i = 0; i < index; ++i) {
count += _blocks[i].total;
}
for (int i = 0; i < offset; ++i) {
count += _blocks[index].count[i];
}
return count;
}
void insert(int val) {
int index = val / _block_size;
int offset = val % _block_size;
++_blocks[index].total;
++_blocks[index].count[offset];
}
};
public:
/**
* @param a: an integer array
* @return: A list of integers includes the index of the first number and the index of the last number
*/
vector<int> countOfSmallerNumberII(vector<int> &a) {
// write your code here
if (a.size() <= 0) {
return {};
}
std::vector<int> result;
result.reserve(a.size());
BlockManager mgr(100000);
for (auto num : a) {
result.push_back(mgr.get_count(num));
mgr.insert(num);
}
return result;
}
};