第一种写法:
const int MX = 1e5;
bool isPrime[MX + 1];//是否为质数
unordered_map<int, vector<int>>mp;
/// <summary>
/// 埃及筛,求每个质数的因数
/// </summary>
int init = []() {
memset(isPrime, 1, sizeof(isPrime));
for (int i = 2; i <= MX; i++)
{
if (isPrime[i]) {
for (int j = i * 2; j <= MX; j += i)
{
isPrime[j] = false;
mp[j].emplace_back(i);
}
}
}
return 0;
}();
bool Solution::canTraverseAllPairs(vector<int>& nums)
{
init;
//do something
}
第二种写法:
const int MX = 1e5;
bool isPrime[MX + 1];//是否为质数
unordered_map<int, vector<int>>mp;
/// <summary>
/// 埃及筛,求每个质数的因数
/// </summary>
void init() {
memset(isPrime, 1, sizeof(isPrime));
for (int i = 2; i <= MX; i++)
{
if (isPrime[i]) {
for (int j = i * 2; j <= MX; j += i)
{
isPrime[j] = false;
mp[j].emplace_back(i);
}
}
}
};
bool Solution::canTraverseAllPairs(vector<int>& nums)
{
init();
//do something
}
这是力扣上面的一道题,需要先调用init方法对数据做预处理。我用第二种写法做预处理,时间和内存都爆了。用第一种方法预处理则可以正确通过。这两种写法有什么差异吗?
同学你好,
第一种写法:
程序启动时,init
Lambda 表达式执行一次预处理操作。之后,对每个测试用例调用 canTraverseAllPairs
函数时,都能直接使用已经处理好的数据,无需再次计算。
第二种写法:
对于每个测试用例,调用 canTraverseAllPairs
函数时,init
函数都会重新执行,导致重复计算,增加了时间和内存的开销。