• leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes


    263. Ugly Number

     注意:1.小于等于0都不属于丑数

        2.while循环的判断不是num >= 0, 而是能被2 、3、5整除,即能被整除才去除这些数

    class Solution {
    public:
        bool isUgly(int num) {
            if(num <= 0)
                return false;
            while(num % 2 == 0)
                num /= 2;
            while(num % 3 == 0)
                num /= 3;
            while(num % 5 == 0)
                num /= 5;
            return num == 1 ? true : false;
        }
    };

    264. Ugly Number II 

    用一个数组去存第n个前面的所有整数,然后记录2 、3、5当前数的索引,每次选择最小的数。注意每次满足最小数,是索引加1,不是数值本身加1

    class Solution {
    public:
        int nthUglyNumber(int n) {
            int result[n + 1];
            result[1] = 1;
            int index = 1,index2 = 1,index3 = 1,index5 = 1;
            while(index < n){
                index++;
                int num2 = result[index2] * 2;
                int num3 = result[index3] * 3;
                int num5 = result[index5] * 5;
                int min_num = min(num2,min(num3,num5));
                result[index] = min_num;
                if(num2 == min_num)
                    index2++;
                if(num3 == min_num)
                    index3++;
                if(num5 == min_num)
                    index5++;
            }
            return result[n];
        }
    };

    313. Super Ugly Number

    这个和Ugly Number II 几乎是一样的,不同的是Ugly Number II是固定了2 、3、5这三个数,这个题是给一个数组。

    class Solution {
    public:
        int nthSuperUglyNumber(int n, vector<int>& primes) {
            int result[n+1];
            result[1] = 1;
            vector<int> index(primes.size(),1);
            int ind = 1;
            while(ind < n){
                ind++;
                int min_num = INT_MAX;
                for(int i = 0;i < primes.size();i++)
                    min_num = min(result[index[i]] * primes[i],min_num);
                result[ind] = min_num;
                for(int i = 0;i < primes.size();i++){
                    if(result[index[i]] * primes[i] == min_num)
                        index[i]++;
                }
            }
            return result[n];
        }
    };

     204. Count Primes

    质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数。

    这个题跟丑数的题一样,也需要用数组存。

    思路:用j=2一个一个乘以质数i,只要乘到的值都不是质数,因为质数只能是1和他本身

    class Solution {
    public:
        int countPrimes(int n) {
            if(n <= 1)
                return 0;
            vector<bool> flag(n+1,true);
            int count = 0;
            for(int i = 2;i < n;i++){
                if(flag[i] == true){
                    count++;
                    for(int j = 2;j*i < n;j++)
                        flag[j*i] = false;
                }
            }
            return count;
        }
    };

    https://www.jianshu.com/p/12c0e91c696e

    https://blog.csdn.net/github_39261590/article/details/73864039 图解

    更新代码:   

        如果问题变成:求不超过10000的最大质数?用最快方法找到1到10000的质数?

        只要把上面代码里面为false的坐标+1就可以得到,但是有个问题,子循环是j=1开始的,也就是会把当前的质数也变成true,对于计算个数问题不大,但是你如果要再把这些提取出来就错误了,从2开始才是真正可以泛化到其他两个问题的通用代码

  • 相关阅读:
    Spring中获取数据库表主键序列
    java学习:ArrayList的实现及原理
    MyBatis SQL动态装配
    Unsupported major.minor version 51.0解决方法
    spring自动装配
    c# 窗口关闭方法
    C# 自定义集合类
    C#接口的实现和继承实践
    C# 开发COM组件供c++使用
    C# 创建和引入动态链接库dll文件
  • 原文地址:https://www.cnblogs.com/ymjyqsx/p/10784311.html
Copyright © 2020-2023  润新知