【Java刷题 15-1】注释+思路 —— 面试题 17.09. 第 k 个数

112 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第 天,点击查看活动详情


LeetCode - 面试题 17.09. 第 k 个数

原题链接:面试题 17.09. 第 k 个数

题目描述

有些数的素因子只有 3,5,7,请设计一个算法找出第 k个数。注意,不是必须有这些素因子,而是必须不包含其他的素因子。

例如,前几个数按顺序应该是 1,3,5,7,9,15,21。

示例 1:

输入: k = 5

输出: 9

解题思路

要求第K个数,而这些数只有素因子 3,5,7;

我们可以将三个素因子用数组保存起来,轮流将素因子与前K-1个数中的每一个数相乘,就可以得到第 k 个数;

当数与素因子相乘,我们可能会得到重复的数,则就需要使用内容不可重复的Set集合来去重,确定不重复再放入最小堆中存放。

最小堆的堆顶元素就是最小的数,所以只需要让堆顶元素出堆,取出来的第K个数就是前K的数中的第K个。

其实这道题在前面的刷题打卡中已经做过了,不过题目名字叫 ‘丑数’,当作复习一下...

提交代码

class Solution {
    public int getKthMagicNumber(int k) {
        int[] arr = new int[]{3,7,5};     //将素因子存入数组备用
        long n = 1l;                      //1是第一个数,用长整型是因为结果可能超出整形范围
        Set<Long> set = new HashSet<>();  //创建Set集合,用于排除重复的数
        //创建优先队列,默认为最小堆
        PriorityQueue<Long> que = new PriorityQueue<>();
        
        //将一个数分别与三个素因子相乘,若不重复则入最小堆
        for(int i = 1;i < k;++i){
            for(int a : arr){//将一个数分别与三个素因子相乘
                long q = n*a;//从第一个数1开始与素因子相乘
               if(set.add(q)){//若能放入set集合,说明没重复
                   que.offer(q);//入最小堆
               }
            }
            n = que.poll();     //从第二个数开始记录,直到第k个数
        } 
            return (int)n;      //转化为整形输出
        
    }
}

提交结果

在这里插入图片描述