题目来源: 970. 强整数
题目描述:
- 描述: 给定三个整数 x 、 y 和 bound ,返回的值小于或等于 bound 的所有的强整数 组成的列表 。 如果某一个整数可以表示为 ,其中整数 i >= 0 且 j >= 0的话,那么我们就认为这个整数就是一个 强整数 。 你可以按照 任何的顺序进行返回答案。在你的回答中,每个值 最多只能 出现一次。
- 示例:
示例1:
输入:x = 2, y = 3, bound = 10
输出:[2,3,4,5,7,9,10]
解释:
示例2:
输入:x = 3, y = 5, bound = 15
输出:[2,4,6,8,10,14]
思路
思路1 我们枚举i 和j 的所有的可能性,然后计算,判断算出来的结果是否小于等于bound。如果满足条件,那么就放入一个哈希集合,最后我们再将集合转成数组,然后进行返回。
当x的值等于1 时,i 无论取的是什么值,都是等效于i 取0。当x的值大于1 时,因为bound 的上限是,因此i 的上限为20。可以将这个作为一个粗略的上限,j 同理。
题目需要我们找出所有不超过bound 的强整数,我们注意到bound 的取值范围不超过,而。因此,如果x≥2,那么i 最大不超过20,才有可能使得≤bound 成立。同理,如果y≥2,那么j 最大不超过20。
具体实现1
class Solution {
public List<Integer> powerfulIntegers(int x, int y, int bound) {
Set<Integer> set = new HashSet<Integer>();
int value1 = 1;
for (int i = 0; i < 21; i++) {
int value2 = 1;
for (int j = 0; j < 21; j++) {
int value = value1 + value2;
if (value <= bound) {
set.add(value);
} else {
break;
}
value2 *= y;
}
if (value1 > bound) {
break;
}
value1 *= x;
}
return new ArrayList<Integer>(set);
}
}
复杂度分析1:
-
时间复杂度:O(),双层循环的时间复杂度是O()
-
空间复杂度:O(),是哈希集合的空间复杂度。