题目的链接在这里:https://www.nowcoder.com/practice/6aa9e04fc3794f68acf8778237ba065b
题目大意
把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第 n个丑数。数据范围:0 \le n \le 20000≤n≤2000
要求:空间复杂度 O(n)O(n) , 时间复杂度 O(n)O(n)
一、示意图
二、解题思路
错误代码 arrayList
错误代码
代码如下:
package LeetCode;
import java.util.*;
/**
* @author wzw324
*/
public class Test11 {
final static int num=2000;
public int GetUglyNumber_Solution(int index) {
//好像是有关的数都赋值为丑数 丑数的2 3 5倍数也全都是丑数
//写一个函数来判断是不是丑数
boolean[] isUgly=new boolean[2000];
isUgly[1]=true;
isUgly[2]=true;
isUgly[3]=true;
isUgly[5]=true;
//然后开始遍历 如果这个数 除以 2 3 5的商是丑数 那他就是丑数
//这里除法出现了以外 7/5也等于1... 导致后面全是7
for(int i=1;i<num;i++){
//那就一个一个判断
//先判断他可不可以除的尽2
if((i/2)*2==i){
//说明除的尽
if(isUgly[i/2]){
isUgly[i]=true;
//后面判断就不必了
continue;
}
}
if((i/3)*3==i){
//说明除的尽
if(isUgly[i/3]){
isUgly[i]=true;
continue;
}
}
if((i/5)*5==i){
//说明除的尽
if(isUgly[i/5]){
isUgly[i]=true;
continue;
}
}
}
//然后开始计数
for(int i=1;i<num;i++){
if(isUgly[i]){
index--;
//如果因此index等于0的话 那就是返回对应的值
if(index==0){
return i;
}
}
}
return 0;
}
}
arrayList
代码如下:
import java.util.*;
public class Solution {
public int GetUglyNumber_Solution(int index) {
//先进行边界判断
if(index<=0) {
return 0;
}
ArrayList<Integer> arrayList=new ArrayList<>();
int i2=0,i3=0,i5=0;
arrayList.add(1);
while (arrayList.size()<index){
int v2=arrayList.get(i2)*2;
int v3=arrayList.get(i3)*3;
int v5=arrayList.get(i5)*5;
//然后找到其中的最小值
int minValue=Math.min(v2,Math.min(v3,v5));
//然后放进去 并且判断是哪个值
arrayList.add(minValue);
//也就是下一个是哪一个的代表
if(minValue==v2) {
i2++;
}
if(minValue==v3){
i3++;
}
if(minValue==v5){
i5++;
}
}
//跳出循环之后 就可以进行判断了
return arrayList.get(index-1);
}
}