劍指offer—49.醜數—分析及程式碼(Java)

江南土豆發表於2020-10-09

一、題目

把只包含質因子 2、3 和 5 的數稱作醜數(Ugly Number)。例如 6、8 都是醜數,但 14 不是,因為它包含質因子 7。 習慣上我們把 1 當做是第一個醜數。求按從小到大的順序的第 N 個醜數。

二、分析及程式碼

1. 標記位置 + 依次求解

(1)思路

由於醜數只包含質因子 2、3 和 5,可通過將這 3 個因子相乘,按由小到大的順序獲得各個醜數。
在計算過程中,下一醜數來自於已生成的某個醜數乘以 2、3 或 5,而已生成的醜數陣列是有序的,可以設計 3 個標記,分別記錄最近一次與各因子相乘生成所需醜數時所用資料的位置,從而避免重複的運算。

(2)程式碼

import java.util.*;
public class Solution {
    public int GetUglyNumber_Solution(int index) {
        if (index <= 0)
            return 0;
        ArrayList<Integer> uglyNums = new ArrayList<>();
        uglyNums.add(1);
        
        int i2 = 0, i3 = 0, i5 = 0;
        int num2 = uglyNums.get(i2++) * 2;
        int num3 = uglyNums.get(i3++) * 3;
        int num5 = uglyNums.get(i5++) * 5;
        
        for (int i = 1; i < index; i++) {
            int num = Math.min(num2, Math.min(num3, num5));
            uglyNums.add(num);
            if (num == num2)
                num2 = uglyNums.get(i2++) * 2;
            if (num == num3)
                num3 = uglyNums.get(i3++) * 3;
            if (num == num5)
                num5 = uglyNums.get(i5++) * 5;
        }
        return uglyNums.get(index - 1);
    }
}

(3)結果

執行時間:21ms,佔用記憶體:9532k。

三、其他

暫無。

相關文章