虚幻Unreal - A计划(永久有效期) 扫二维码继续学习 二维码时效为半小时

(90评价)
价格: 2800.00元
问一下这两种写法有什么区别
淫魔灭世发起了问答12天前
1
回复
29
浏览

第一种写法:

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方法对数据做预处理。我用第二种写法做预处理,时间和内存都爆了。用第一种方法预处理则可以正确通过。这两种写法有什么差异吗?

所有回复
  • 老师_小面包 9天前

    同学你好,

    • 第一种写法
      程序启动时,init Lambda 表达式执行一次预处理操作。之后,对每个测试用例调用 canTraverseAllPairs 函数时,都能直接使用已经处理好的数据,无需再次计算。

    • 第二种写法
      对于每个测试用例,调用 canTraverseAllPairs 函数时,init 函数都会重新执行,导致重复计算,增加了时间和内存的开销。

    还有-5条回复,点击查看
    你还没有登录,请先登录注册
发表回复
你还没有登录,请先 登录或 注册!