Leetcode970. 强整数

Every day a Leetcode

题目来源:970. 强整数

解法1:枚举

枚举 i 和 j 所有的可能性,然后计算 pow(x, i) + pow(y, j),判断是否 <= bound。若满足,则放入一个哈希集合,最后将集合转成数组返回。

第一种枚举方法:

int num1 = 1;
for (int i = 0; i <= 20; i++)
{
	int num2 = 1;
	for (int j = 0; j <= 20; j++)
	{
		int num = num1 + num2;
		if (num <= bound)
			nums.insert(num);
		else
			break;
		num2 *= y;
	}
	if (num1 >= bound)
		break;
	num1 *= x;
}

第二种枚举方法:

for (int i = 1; i < bound; i *= x)
{
	for (int j = 1; i + j <= bound; j *= y)
	{
		nums.insert(i + j);
		if (y == 1)
			break;
	}
	if (x == 1)
		break;
}

代码:

/*
 * @lc app=leetcode.cn id=970 lang=cpp
 *
 * [970] 强整数
 */

// @lc code=start
class Solution
{
public:
    vector<int> powerfulIntegers(int x, int y, int bound)
    {
        unordered_set<int> nums;
        // for (int i = 1; i < bound; i *= x)
        // {
        //     for (int j = 1; i + j <= bound; j *= y)
        //     {
        //         nums.insert(i + j);
        //         if (y == 1)
        //             break;
        //     }
        //     if (x == 1)
        //         break;
        // }
        int num1 = 1;
        for (int i = 0; i <= 20; i++)
        {
            int num2 = 1;
            for (int j = 0; j <= 20; j++)
            {
                int num = num1 + num2;
                if (num <= bound)
                    nums.insert(num);
                else
                    break;
                num2 *= y;
            }
            if (num1 >= bound)
                break;
            num1 *= x;
        }
        return vector<int>(nums.begin(), nums.end());
    }
};
// @lc code=end

结果:

Leetcode970. 强整数_第1张图片

复杂度分析:

时间复杂度:O(log2(bound)),双层循环的时间复杂度是 O(log2(bound))。

空间复杂度:O(log2(bound)),是哈希集合的空间复杂度。

你可能感兴趣的:(Every,day,a,leetcode,leetcode,算法)