Leetcode 970:强整数(超详细的解法!!!)

本文介绍了一种算法,用于找出所有小于或等于给定界限的强整数,即那些可以表示为两个非负整数的幂次和的整数。通过计算最大幂次并遍历所有可能组合,确保每个值只出现一次。

给定两个非负整数 xy,如果某一整数等于 x^i + y^j,其中整数 i >= 0j >= 0,那么我们认为该整数是一个强整数

返回值小于或等于 bound 的所有强整数组成的列表。

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

示例 1:

输入:x = 2, y = 3, bound = 10
输出:[2,3,4,5,7,9,10]
解释: 
2 = 2^0 + 3^0
3 = 2^1 + 3^0
4 = 2^0 + 3^1
5 = 2^1 + 3^1
7 = 2^2 + 3^1
9 = 2^3 + 3^0
10 = 2^0 + 3^2

示例 2:

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

提示:

  • 1 <= x <= 100
  • 1 <= y <= 100
  • 0 <= bound <= 10^6

解题思路

这个问题非常简单。我们首先计算ij的最大值

  • i = i n t ( l o g x 100 ) + 1   i f   x ≠ 1   e l s e   1 i=int(log_x^{100})+1\ if \ x \neq1 \ else \ 1 i=int(logx100)+1 if x̸=1 else 1
  • i = i n t ( l o g y 100 ) + 1   i f   y ≠ 1   e l s e   1 i=int(log_y^{100})+1\ if \ y \neq1 \ else \ 1 i=int(logy100)+1 if y̸=1 else 1

然后问题就非常简单了,只要遍历range(i)range(j),然后判断结果是否满足条件即可。但是我们在计算的过程中会出现重复值,所以一个解决方法就是通过set存储,最后转化为list即可。

class Solution:
    def powerfulIntegers(self, x, y, bound):
        """
        :type x: int
        :type y: int
        :type bound: int
        :rtype: List[int]
        """
        i = 1 if x == 1 else int(math.log(bound, x)) + 1
        j = 1 if y == 1 else int(math.log(bound, y)) + 1
        res = set()

        for m in range(i):
            for n in range(j):
                tmp = x**m + y**n
                if tmp <= bound:
                    res.add(tmp)
                    
        return list(res)

当然这种做法对于python来说比较合适,但是如果我们没有log函数的话,就要对上面这个代码稍加修改。

class Solution:
    def powerfulIntegers(self, x, y, bound):
        """
        :type x: int
        :type y: int
        :type bound: int
        :rtype: List[int]
        """
        res = set()
        i = bound if x == 1 else x
        j = bound if y == 1 else y
        
        m = 1
        while m < bound:
            n = 1
            while n + m <= bound:
                res.add(n + m)
                n *= j
            m *= i
            
        return list(res)      

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值