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

(94评价)
优惠后 ¥1899.00优惠前 ¥2299.00 双十一全年最大力度限时优惠
1对1 答疑即时回复7天无理由退款30天价保提问必答

服务保障

1对1 答疑

提供专属的一对一在线答疑,快速答疑解惑。

即时回复

及时响应学习咨询,帮助解决问题。

7天无理由退款

购买后7天内可申请无理由退款。

30天价保

购买后30天内如遇降价,可申请价保。

提问必答

对于提问做到有问必答,帮您扫清学习过程中的种种障碍

问一下这两种写法有什么区别
淫魔灭世发起了问答2025-04-18
1
回复
342
浏览

第一种写法:

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

所有回复
  • 老师_小面包 • 2025-04-21

    同学你好,

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

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

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