力扣——970. 强整数

103 阅读1分钟

力扣——970. 强整数

970. 强整数

给定三个整数 xybound ,返回 值小于或等于 bound 的所有 强整数 组成的列表

如果某一整数可以表示为 xi + yj ,其中整数 i >= 0j >= 0,那么我们认为该整数是一个 强整数

你可以按 任何顺序 返回答案。在你的回答中,每个值 最多 出现一次。

示例 1:

输入:x = 2, y = 3, bound = 10
输出:[2,3,4,5,7,9,10]
解释: 
2 = 20 + 30
3 = 21 + 30
4 = 20 + 31
5 = 21 + 31
7 = 22 + 31
9 = 23 + 30
10 = 20 + 32

示例 2:

输入:x = 3, y = 5, bound = 15
输出:[2,4,6,8,10,14]

提示:

  • 1 <= x, y <= 100
  • 0 <= bound <= 106

问题解析

可以用两个for循环来分别枚举数字i和数字j。

然后再计算x的i次幂和y的j次幂,再计算它们的和,如果它们的和大于bound,则不存入数组。

把他们的和存入vector中,为了去重(防止存入相同的数),我们可以用一个哈希表map来存储所有数的出现次数,如果m+n之前没有出现过,就存入数组中,并把它的出现次数改为1.

最后返回vector。

这里我最外层for枚举的是i,内层枚举的是j,注意到bound的大小是1e6,那么我们最多就枚举到20即可,因为即便是2的20次幂,也大于1e6了。至于计算次幂的操作,可以用c++自带的pow函数做到。如果x的i次幂大于等于bound就结束循环,如果y的j次幂与x的i次幂之和大于bound,则去枚举下一个i。

AC代码

class Solution {
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        vector<int>v;
        unordered_map<int,int>mymap;
        for(int i=0;i<20;i++)
        {
            int n=pow(x,i),m=0;
            if(n>=bound)break;
            for(int j=0;j<20;j++)
            {
                m=pow(y,j);
                if(n+m>bound)break;
                if(!mymap.count(n+m))
                {
                    v.push_back(n+m);
                    mymap[n+m]=1;
                }
            }
        }
        return v;
    }
};