一举拿下LeetCode[丑数]|刷题打卡

354 阅读4分钟

前言

本文正在参与掘金团队号上线活动,点击 查看大厂春招职位

今天是参与掘金刷题打卡活动的第一天,也是我第一次参与这种类型的活动,那就从每天的每一题开始吧。

题目

题目来源LeetCode 263. 丑数

也是今天的每日一题,题目描述如下:

给你一个整数 n ,请你判断 n 是否为 丑数 。如果是,返回 true ;否则,返回 false 。

丑数 就是只包含质因数 2、3 和/或 5 的正整数。

题目示例

思路

话不多说,直接先说下思路:

判断一个数是不是丑数的依据是这个数只存在2,3,5三数组合的质因数,不能包括别的,比如说14就不行,因为14的质因数里面有7,而7不在这三数组合里面;

另外 1 也是丑数;

我们可以用辗转相除的思想看待问题,将一个数从 5 开始除,如果余数为零则说明能够整除,那么就不断的除以 5 ,直到无法继续整除,那么改变除数为 3,再继续,同样如法炮制数字 2,如果最后结果能够为 1 ,则说明能够被 三数字组合整除,也就不包括其他质因数,得出结论该数为丑数。

代码

class Solution {
    public boolean isUgly(int n) {
        if(n < 1) return false;
        while(n % 5 == 0){
            n /= 5;
        }
        while(n % 3 == 0){
            n /= 3;
        }
        while(n % 2 == 0){
            n /= 2;
        }
        return n == 1;
    }
}

代码过程比较简单,我就不做过多说明了。

扩展

你以为这样就完了吗?

当然不会!做题目最重要的就是举一反三,能够触类旁通,在刷题过程中我们最好的就是在做完一题后能够总结出这题的一些关键思路和模板,这点力扣做的还是非常人性化的,我们可以通过下面的标签找到该题所属的分类和相似题目:

相似题目

这样还省去了很多我们人工查找分类的成本,要是觉得单做一题不过瘾,那么就可以深入扩展的学习一下相似题目,然后通过同类型的题目总结规律。从而量变引起质变!

题目

出自LeetCode丑数的相似题目:264. 丑数 II

题目描述如下:

编写一个程序,找出第 n 个丑数。

丑数就是质因数只包含 2, 3, 5正整数

题目示例

思路

第一反应是打表,哈哈哈,但是感觉这么做有点蠢,还是用动态规划吧。

先定义以 dp 数组,然后从 第一个开始直到找到第 n 个,加入到 dp 数组中;

有三个数字组合 2, 3, 5 ,dp数组的第一个元素肯定是数字1,然后每次从当前数字乘以组合里面的数字中取出最小的一个作为 dp 数组的下一个元素:

dp[i] = min(dp[p] * {2,3,5});

状态转移就是这样的。

代码

下面下代码:

class Solution {
    public int nthUglyNumber(int n) {
       int dp[] = new int[n + 1];
       dp[1] = 1;
       int p2 = 1, p3 = 1, p5 = 1;

       for(int i = 2; i <= n; i++){
           int n2 = dp[p2] * 2;
           int n3 = dp[p3] * 3;
           int n5 = dp[p5] * 5;
           dp[i] = Math.min(Math.min(n2, n3), n5);
           if (dp[i] == n2) p2++;
           if (dp[i] == n3) p3++;
           if (dp[i] == n5) p5++;
       }
       return dp[n];
    }
}

后序

在LeetCode刷题的时候,我一般是先独立思考5分钟左右,如果没有思路,或者思路不可行,那么就直接看题解,先选择一种题解看明白,然后尝试 coding,之后再提交通过并理解后,再深入思考别的解法或者优化。

我是江璇,一个新人程序员(Java开发),目前大四,双非本,大学没项目,没竞赛,甚至学习成绩也不优秀的小菜鸡,校招面试一路走来吃了许多亏,拿了几个小offer,最终上岸。虽比不得那些优秀的大佬们,但是也在不断努力着,最近在做微信公众号运营,求一波关注【公众号:江璇Up】,不定期分享校招面经资料,Java技术栈知识和自己的成长故事,也可以加我个人微信【UpJiangXuan】,一起做个朋友圈点赞之交,一起见证努力见证进步!