力扣——970. 强整数
970. 强整数
给定三个整数 x 、 y 和 bound ,返回 值小于或等于 bound 的所有 强整数 组成的列表 。
如果某一整数可以表示为 xi + yj ,其中整数 i >= 0 且 j >= 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 <= 1000 <= 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;
}
};