ソードフィンガーオファーインタビュー質問49:醜い数字

この質問では、最初の私の考えは、生成された醜い数を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];
    }

 

おすすめ

転載: blog.csdn.net/qq_40473204/article/details/114632280