剑指offer—49.丑数—分析及代码(Java)

剑指offer——49.丑数——分析及代码[Java]

  • 一、题目
  • 二、分析及代码
    • 1. 标记位置 + 依次求解
      • (1)思路
      • (2)代码
      • (3)结果
  • 三、其他

一、题目

把只包含质因子 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。

三、其他

暂无。

你可能感兴趣的:(数据结构与算法,剑指offer,Java,题解)