[LeetCode] 970. Powerful Integers 強力數字



Given two positive integers x and y, an integer is powerful if it is equal to x^i + y^j for some integers i >= 0 and j >= 0.

Return a list of all powerful integers that have value less than or equal to bound.

You may return the answer in any order.  In your answer, each value should occur at most once.

Example 1:

Input: x = 2, y = 3, bound = 10
Output: [2,3,4,5,7,9,10]
Explanation:
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

Example 2:

Input: x = 3, y = 5, bound = 15
Output: [2,4,6,8,10,14]

Note:

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

這道題定義了一種強力整數,說是給定的整數x和y分別的i次冪和j次冪之和,現在又給了一個整數 bound,讓返回不超過這個范圍的所有的強力整數。既然是一道 Easy 的題目,就不要考慮太多的技巧了,直接上無腦破解了吧。博主最開始的解法是在 bound 范圍內先分別生成x和y的指數數組,即 x^0, x^1, x^2....y^0, y^1, y^2....,然后從兩個數組中各自任意取出一個數字來相加,只要不超過 bound,就可以放入結果 res 中了,需要注意的是,若x和y等於1的話,那么會陷入死循環,因為乘以1永遠等於其本身,所以要加另外的判斷。博主的方法其實可以優化一下,沒有必要用額外的數組去保存,而是可以直接在 for 循環中處理就可以了。還有,為了防止重復數字,先是把結果都存入一個 TreeSet 中,利用其可以去除重復項的特點,最后再轉回數組就行了,參見代碼如下:


class Solution {
public:
    vector<int> powerfulIntegers(int x, int y, int bound) {
        set<int> res;
        for (int a = 1; a < bound; a *= x) {
            for (int b = 1; a + b <= bound; b *= y) {
                res.insert(a + b);
                if (y == 1) break;
            }
            if (x == 1) break;
        }
        return vector<int>(res.begin(), res.end());
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/970


參考資料:

https://leetcode.com/problems/powerful-integers/

https://leetcode.com/problems/powerful-integers/discuss/214212/JavaC%2B%2BPython-Easy-Brute-Force

https://leetcode.com/problems/powerful-integers/discuss/214197/Java-straightforward-try-all-combinations


LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM