この質問では、最初の私の考えは、生成された醜い数を2、3、5で乗算することでした。生成されたリストの合計に順番に追加しますが、この方法には問題があります。つまり、各数に乗算されます。 2. 3と5の後、得られた数の間に他の未生成の醜い数があります。したがって、この質問の要点は、醜い数を順番に生成することです。
答えは、生成された配列では、醜い数は小さいものから大きいものまであります。2を掛ける数、3を掛ける数、5を掛ける数については、3つのint量を設定し、それらを記録します。配列内の位置。これらの3つの量は、最初は配列の最初の要素であり、配列に別の要素を追加する必要があるたびに、3つの量の対応する数にそれぞれ2、3、および5を掛けると、小さい方の量は次のようになります。追加。、そして対応する量が右にシフトされます。このように、配列内の番号は、追加時に調整せずに昇順で配置されます。
エラーコードの時間が超過しました
class Solution {
public int nthUglyNumber(int n) {
if(n==1){
return 1;
}
int count = 1;
List<Integer> cur_u_nums = new LinkedList<Integer>();
List<Integer> pre_u_nums = new LinkedList<Integer>();
List<Integer> total_u_nums = new LinkedList<Integer>();
Set<Integer> total_nums_set = new HashSet();
Set<Integer> pre_total_nums_set = new HashSet();
pre_u_nums.add(1);
total_nums_set.add(1);
total_u_nums.add(1);
int t_length = 0;
while(t_length <= n){
for(Integer i : pre_u_nums){
cur_u_nums.add(i*2);
cur_u_nums.add(i*3);
cur_u_nums.add(i*5);
}
int count_result = total_u_nums.size();
int max_2 = 0;
for(Integer i : cur_u_nums){
int larger_mark = 0;
for(int count_inner = 0;count_inner<count_result;count_inner++){
if(total_u_nums.get(count_inner)>i){
if(max_2==0){
t_length = count_inner;
max_2 = 1;
}
total_u_nums.add(count_inner,i);
count_result++;
larger_mark = 1;
break;
}else if(total_u_nums.get(count_inner)<i){
continue;
}else if(total_u_nums.get(count_inner)==i){
larger_mark = 1;
break;
}
}
if(larger_mark == 0){
count_result++;
total_u_nums.add(i);
}
}
pre_u_nums = cur_u_nums;
cur_u_nums = new LinkedList<Integer>();
}
return total_u_nums.get(n-1);
}
}
回答コード(どのインデックスが増加しているかを直接判断することはなく、新しく追加された要素よりも小さい)
public int nthUglyNumber(int n) {
int index_2 = 0;
int index_3 = 0;
int index_5 = 0;
int[] nums_u = new int[n];
int end = 0;
nums_u[0] = 1;
for(;end<n-1;){
int min_num = nums_u[index_2]*2 > nums_u[index_3]*3? nums_u[index_3]*3:nums_u[index_2]*2;
min_num = min_num > nums_u[index_5]*5 ? nums_u[index_5]*5 : min_num;
nums_u[++end] = min_num;
while(nums_u[index_2]*2 <= nums_u[end]){
index_2++;
}
while(nums_u[index_3]*3 <= nums_u[end]){
index_3++;
}
while(nums_u[index_5]*5 <= nums_u[end]){
index_5++;
}
}
return nums_u[n-1];
}