LeetCode.970-強大的整數(Powerful Integers)

這是悅樂書的第367次更新,第395篇原創

01 看題和準備

今天介紹的是LeetCode算法題中Easy級別的第229題(順位題號是970)。給定兩個正整數xy,如果對於某些整數i >= 0j >= 0等於x^i + y^j,則整數是強大的。

返回值小於或等於bound的所有強大整數的列表。

你可以按任何順序返回答案。在你的答案中,每個值最多應出現一次。例如:

輸入: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

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

注意

  • 1 <= x <= 100

  • 1 <= y <= 100

  • 0 <= bound <= 10^6

02 第一種解法

直接翻譯題目即可,沒有什麼特殊的技巧,但是需要注意一點,因爲判斷條件時x或者y的幾次方小於bound,如果x或者y爲1的時候,1的任何次方都會是1,會一直小於bound,會造成死循環。

public List<Integer> powerfulIntegers(int x, int y, int bound) {
    Set<Integer> set = new HashSet<Integer>();
    for (int i=0; Math.pow(x, i) < bound; i++) {
        for (int j=0; Math.pow(y, j) < bound; j++) {
            int sum = (int)Math.pow(x, i)+(int)Math.pow(y, j);
            if (sum <= bound) {
                set.add((int)sum);
            }
            // y等於1時,容易造成死循環,要結束掉
            if (y == 1) {
                break;
            }
        }
        // x等於1時,容易造成死循環,要結束掉
        if (x == 1) {
            break;
        }
    }
    return new ArrayList<>(set);
}


03 第二種解法

針對上面第一種解法,我們也可以不借助Math類的pow方法,用累計相乘替代,思路都是一樣的。

public List<Integer> powerfulIntegers2(int x, int y, int bound) {
    Set<Integer> set = new HashSet<Integer>();
    for (int i=1; i<bound; i *= x) {
        for (int j=1; j<bound; j *= y) {
            if (i+j <= bound) {
                set.add(i+j);    
            }
            if (y == 1) {
                break;
            }
        }
        if (x == 1) {
            break;
        }
    }
    return new ArrayList<>(set);
}


04 小結

算法專題目前已連續日更超過七個月,算法題文章235+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章