剑指offer34题:
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。
解题思路:本题剑指上说的很麻烦,其实思路很简单,我们只用比较3个数:用于乘2的最小的数、用于乘3的最小的数,用于乘5的最小的数。
package com.nowcoder.jianzhi; import org.junit.Test; import java.util.ArrayList; /** * 把只包含质因子2、3和5的数称作丑数(Ugly Number)。 * 例如6、8都是丑数,但14不是,因为它包含质因子7。 * 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。 * 算法思路:三路归并 */ public class GetUglyNumber_Solution_33 { public int GetUglyNumber_Solution(int n) { if(n<=0) return 0; ArrayList<Integer> list = new ArrayList<Integer>(); list.add(1); int i = 0 ; int j = 0 ; int k = 0 ; while (list.size()<n){//循环index-1次,当list的大小小于所求的第n个元素的序列的时候 int t = Math.min(list.get(i)*2,Math.min(list.get(j)*3,list.get(k)*5)); //找出三个数里面的最小值 list.add(t); if(list.get(i)*2==t) i++; if(list.get(j)*3==t) j++; if(list.get(k)*5==t) k++; } return list.get(list.size()-1); } @Test public void test(){ System.out.println(GetUglyNumber_Solution(1000)+" "); } }