LeetCode刷题之970.强整数

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
  • 代码1:
class Solution:
    def powerfulIntegers(self, x: int, y: int, bound: int) -> List[int]:
        a = []
        for i in range(20):
            for j in range(20):
                if x**i + y**j <= bound:
                    a.append(x**i + y**j)
        return(list(set(a)))
# 执行用时 :72 ms, 在所有 Python3 提交中击败了22.11%的用户
# 内存消耗 :13.7 MB, 在所有 Python3 提交中击败了5.26%的用户
  • 算法说明:
    由于bound <= 10^6 = 1000000,正整数里面,幂次方大于本身的最小的数是2,并且2^20 = 1,048,576 > 1000000,所以只要循环 20 次一定可以得到满足x^i + y^j <= bound的所有解。最后用set函数滤除掉重复的元素,转化为list格式输出。
  • 代码2:
class Solution:
    def powerfulIntegers(self, x: int, y: int, bound: int) -> List[int]:
        i,j = 0,0
        a = []
        if x == 1 and y != 1:
            while y ** i + 1 <= bound:
                a.append(y ** i + 1)
                i += 1
            return(a)
        if x != 1 and y == 1:
            while x ** i + 1 <= bound:
                a.append(x ** i + 1)
                i += 1
            return(a)
        if x == 1 and y == 1 and (bound == 1 or bound == 0) :
            return([])
        if x == 1 and y == 1:
            return([2])
        while x**i <= bound:
            while x**i + y**j <= bound:
                a.append(x**i + y**j)
                j += 1
            i,j= i+1,0
        return(list(set(a)))
# 执行用时 :72 ms, 在所有 Python3 提交中击败了22.11%的用户
# 内存消耗 :13.8 MB, 在所有 Python3 提交中击败了5.26%的用户
  • 算法说明:
    分下面几种情况:
    (1)如果x = 1,y != 1x 的任何次方都等于 1,返回符合条件的 yi 次方 +1 的所有解,
    (2)如果x != 1,y = 1y 的任何次方都等于 1,返回符合条件的 xi 次方 +1 的所有解,
    (3)如果x = 1,y = 1,且bound01,则没有满足条件的解,返回空列表,
    (4)如果x = 1,y = 1,且bound大于 1,则只有 2 满足条件,返回 [2],
    (5)如果x > 1,y > 1,且bound大于1,用 while 循环求出所有的解,用set函数滤除掉重复的元素,转化为list格式输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

O_胡萝卜_O

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值