33.丑数
题目描述
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路
由题述可知,丑数乘以基本的丑数{2,3,5}后得到的依旧是丑数。为乘2,3,5各建立一个数组,存储乘以它们所得的丑数,由于每次增长的幅度不一致,所以丑数数组并不是规律的按照2->3->5的顺序依次从存储数组中取值,要每次从中取头值比较大小,将最小值加入记录的丑数数组,遇到数组中已经存在的值时直接删去。
代码实现
import java.util.ArrayList;
public class Solution {
public int GetUglyNumber_Solution(int index) {
if (index == 0) {
return 0;
}
ArrayList<Integer> pos = null;
ArrayList<Integer> pos2 = new ArrayList<>();
pos2.add(2);
ArrayList<Integer> pos3 = new ArrayList<>();
pos3.add(3);
ArrayList<Integer> pos5 = new ArrayList<>();
pos5.add(5);
ArrayList<Integer> ugly = new ArrayList<>();
ugly.add(1);
while (ugly.size() < index) {
pos = GetMinHeadArray(pos2,pos3,pos5);
int posValue = pos.get(0);
if(!ugly.contains(posValue)){
pos2.add(posValue*2);
pos3.add(posValue*3);
pos5.add(posValue*5);
ugly.add(posValue);
System.out.println("pos2: "+pos2.get(0)+" pos3: "+pos3.get(0)+" pos5:"+pos5.get(0)+" ugly.add: "+posValue);
}
pos.remove(0);
}
return ugly.get(index-1);
}
/* 返回含有最小头值的列表 */
public ArrayList<Integer> GetMinHeadArray(ArrayList<Integer> pos2,ArrayList<Integer> pos3,ArrayList<Integer> pos5) {
int i2 = pos2.get();
int i3 = pos3.get();
int i5 = pos5.get();
if (i2 < i3){
if (i2 < i5) {
return pos2;
}
else {
return pos5;
}
}
else {
if (i3 < i5) {
return pos3;
}
else {
return pos5;
}
}
}
}