题解 | #丑数#
丑数
http://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b
动态规划典型应用
思路:我想构造当前丑数,那么必然得通过某个丑数乘2或某个丑数乘3或某个丑数乘5来得到
---------那么,就用三个指针指向这最小的可用的这三种丑数
if (index < 7) { return index; } int[] res = new int[index]; res[0] = 1; //开三个指针指向,每个丑数能有三次机会用来构造新的丑数,指针指向最新的能被使用该机会的丑数。如乘2的机会用完,pos2指针就得指向下一个丑数 //结果而言,每个丑数都得被三个指针指一次,指针分别指向最小的可取的用来乘2、3、5的丑数 int pos2 = 0;// 表示能通过当前指针所指乘2构造新的丑数 int pos3 = 0;// 表示能通过当前指针所指乘3构造新的丑数 int pos5 = 0;// 表示能通过当前指针所指乘5构造新的丑数 // 一个丑数*2/3/5还是丑数 System.out.print(1+" "); for (int i = 1; i < index; i++) { res[i] = Math.min(Math.min(res[pos2] * 2, res[pos3] * 3), res[pos5] * 5); System.out.print(res[i]+" "); if (res[i] == res[pos2] * 2) { pos2++; } if (res[i] == res[pos3] * 3) { pos3++; } if (res[i] == res[pos5] * 5) { pos5++; } } return res[index - 1]; }