1. 程式人生 > 資訊 >交個朋友直播間迴應錘子公司被申請破產:與債權方達成和解,流程已撤回

交個朋友直播間迴應錘子公司被申請破產:與債權方達成和解,流程已撤回

醜數

題目

263. 醜數

給你一個整數 n ,請你判斷 n 是否為 醜數 。如果是,返回 true ;否則,返回 false 。
醜數 就是隻包含質因數 2、3 和/或 5 的正整數。1 通常被視為醜數。

題解

根據醜數的定義,00 和負整數一定不是醜數。

當 n>0n>0 時,若 nn 是醜數,則 nn 可以寫成 n = 2^a \times 3^b \times 5^cn=2
a
×3
b
×5
c
的形式,其中 a,b,ca,b,c 都是非負整數。特別地,當 a,b,ca,b,c 都是 00 時,n=1n=1。

為判斷 nn 是否滿足上述形式,可以對 nn 反覆除以 2,3,52,3,5,直到 nn 不再包含質因數 2,3,52,3,5。若剩下的數等於 11,則說明 nn 不包含其他質因數,是醜數;否則,說明 nn 包含其他質因數,不是醜數。

作者:LeetCode-Solution

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

醜數2

題目

264. 醜數 II
給你一個整數 n ,請你找出並返回第 n 個 醜數 。

醜數 就是隻包含質因數 2、3 和/或 5 的正整數。

解法一 最小堆和set去重

要得到從小到大的第 nn 個醜數,可以使用最小堆實現。

初始時堆為空。首先將最小的醜數 11 加入堆。

每次取出堆頂元素 xx,則 xx 是堆中最小的醜數,由於 2x, 3x, 5x2x,3x,5x 也是醜數,因此將 2x, 3x, 5x2x,3x,5x 加入堆。

上述做法會導致堆中出現重複元素的情況。為了避免重複元素,可以使用雜湊集合去重,避免相同元素多次加入堆。

在排除重複元素的情況下,第 nn 次從最小堆中取出的元素即為第 nn 個醜數。

LeetCode-Solution

使用最小堆,會預先儲存較多的醜數,導致空間複雜度較高,維護最小堆的過程也導致時間複雜度較高。

import java.util.HashSet;
import java.util.PriorityQueue;

class Solution {
    public int nthUglyNumber(int n) {
    	HashSet<Long> visited= new HashSet<Long>();
    	PriorityQueue<Long> q=new PriorityQueue<Long>();
    	q.add(1l);
    	long res=0;
    	while(n-->0)
    	{
    		res=q.poll();
    		long a=res*2,b=res*3,c=res*5;
    		if(!visited.contains(a))
    		{
    			q.add(a);
    			visited.add(a);
    		}
    		if(!visited.contains(b))
    		{
    			q.add(b);
    			visited.add(b);
    		}
    		if(!visited.contains(c))
    		{
    			q.add(c);
    			visited.add(c);
    		}
    		
    	}
    	return (int)res;
    }
}

解法二 動態規劃,三指標

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 num2 = dp[p2] * 2, num3 = dp[p3] * 3, num5 = dp[p5] * 5;
            dp[i] = Math.min(Math.min(num2, num3), num5);
            //三個if的避免了重複的情況,算過了,指標加加,就不用再算了
            if (dp[i] == num2) {
                p2++;
            }
            if (dp[i] == num3) {
                p3++;
            }
            if (dp[i] == num5) {
                p5++;
            }
        }
        return dp[n];
    }
}

超級醜數

313. 超級醜數

超級醜數 是一個正整數,並滿足其所有質因數都出現在質數陣列 primes 中。

給你一個整數 n 和一個整數陣列 primes ,返回第 n 個 超級醜數 。

題目資料保證第 n 個 超級醜數 在 32-bit 帶符號整數範圍內。

示例 1:

輸入:n = 12, primes = [2,7,13,19]
輸出:32
解釋:給定長度為 4 的質數陣列 primes = [2,7,13,19],前 12 個超級醜數序列為:[1,2,4,7,8,13,14,16,19,26,28,32] 。

解法

解法與醜數2一致,兩種方法都行。