劍指offer—49.醜數—分析及程式碼(Java)
一、題目
把只包含質因子 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。
三、其他
暫無。
相關文章
- LeetCode|劍指 Offer 49.醜數LeetCode
- 劍指offer第49題 醜數
- 劍指offer—58_2.左旋轉字串—分析及程式碼(Java)字串Java
- 劍指offer—58.翻轉單詞順序列—分析及程式碼(Java)Java
- 劍指OFFER
- 劍指offer(Java版)--將字串轉換為整數Java字串
- 劍指offer-9-斐波那契數列-javaJava
- 劍指offer解析-上(Java實現)Java
- 劍指offer解析-下(Java實現)Java
- 劍指Offer 表示數值的字串字串
- 《劍指offer》JAVA題解,LeetCode評測JavaLeetCode
- 劍指offer——斐波那契數列
- 劍指Offer-17-列印從1到最大的n位數-Java程式碼實現(兩種思路)Java
- 劍指OFFER-數字在升序陣列中出現的次數(Java)陣列Java
- 劍指offer導航
- Leetcode劍指offer(八)LeetCode
- 劍指 offer21
- 劍指offer16
- 劍指 offer20
- 劍指Offer-31-最小的K個數
- 劍指Offer系列之「表示數值的字串」字串
- 劍指Offer:JZ30-連續子陣列最大和(解題思路+Java程式碼)陣列Java
- 【leetcode】劍指 Offer 16. 數值的整數次方LeetCode
- 【劍指offer】10.程式的完整性
- 劍指offer-JavaScript版JavaScript
- 【劍指Offer】矩形覆蓋
- 劍指Offer題解合集
- 劍指offer——跳臺階
- 六、劍指 Offer(25~29)
- 【劍指offer中等部分4】二進位制中1的個數(java)Java
- 劍指offer:旋轉陣列的最小數字陣列
- 劍指offer 旋轉陣列的最小數字陣列
- Leetcode 劍指 Offer 40. 最小的k個數LeetCode
- [劍指offer] JAVA版題解(完整版)更新中。。。Java
- 劍指offer面試題(41-50)——java實現面試題Java
- 劍指OFFER-從頭到尾列印連結串列(Java)Java
- 劍指offer第41~50題
- 劍指 offer(1) -- 陣列篇陣列