day115 970. 强整数(Java)

90 阅读2分钟

题目来源: 970. 强整数

题目描述:

  • 描述: 给定三个整数 x 、 y 和 bound ,返回的值小于或等于 bound 的所有的强整数 组成的列表 。 如果某一个整数可以表示为 xi +yjx^i + y^j,其中整数 i >= 0 且 j >= 0的话,那么我们就认为这个整数就是一个 强整数 。 你可以按照 任何的顺序进行返回答案。在你的回答中,每个值 最多只能 出现一次。
  • 示例:
示例1:
输入:x = 2, y = 3, bound = 10
输出:[2,3,4,5,7,9,10]

解释: 2=20+302 = 2^0 + 3^0
3=21+303 = 2^1 + 3^0
4=20+314 = 2^0 + 3^1
5=21+315 = 2^1 + 3^1
7=22+317 = 2^2 + 3^1
9=23+309 = 2^3 + 3^0
10=20+3210 = 2^0 + 3^2

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

思路

思路1 我们枚举i 和j 的所有的可能性,然后计算xi+yjx^i+y^j,判断算出来的结果是否小于等于bound。如果满足条件,那么就放入一个哈希集合,最后我们再将集合转成数组,然后进行返回。

当x的值等于1 时,i 无论取的是什么值,都是等效于i 取0。当x的值大于1 时,因为bound 的上限是10610^6,因此i 的上限为20。可以将这个作为一个粗略的上限,j 同理。

题目需要我们找出所有不超过bound 的强整数,我们注意到bound 的取值范围不超过10610^6,而220=1048576>1062^20=1048576>10^6。因此,如果x≥2,那么i 最大不超过20,才有可能使得xi+yjx^i+y^j≤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(log2(bound)log^2(bound)),双层循环的时间复杂度是O(log2(bound)log^2(bound))

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