题目链接:
JZ33 丑数
本题思路:
我们知道,丑数的排列是1,2,3,4,5,6,8,10…
其中规律是:任意一个丑数都是由小于它的某一个丑数乘以2、3或者5得到的,相当于三个结果链表,那么所有丑数的排列,必定就是下面ABC3个链表的合并结果然后去重得到的。
- A:{1*2,2*2,3*2……}
- B:{1*3,2*3,3*3……}
- C:{1*5,2*5,3*5……}
构建丑数数组:我们每次添加进去一个当前计算出来个三个丑数的最小的一个,并且是谁计算的,谁指针就后移一位。
import java.lang.Math;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if(index <= 0) return 0;
int[] dp = new int[index];
dp[0] = 1; // 基础丑数为1
int id2 = 0, id3 = 0, id5 = 0; // 相当于指针 初始指向三个链表中第一个元素
// dp[0]已有值 所以从i = 1开始计数
for(int i = 1; i < index; i++) {
// 获取最小值加入排序数组
dp[i] = Math.min(dp[id2]*2, Math.min(dp[id3]*3, dp[id5]*5));
// 这里不用else if 因为三个链表可能有相同元素
// 此时三个链表指针都要移动
if(dp[id2]*2 == dp[i]) id2 += 1;
if(dp[id3]*3 == dp[i]) id3 += 1;
if(dp[id5]*5 == dp[i]) id5 += 1;
}
return dp[index - 1];
}
}