交個朋友直播間迴應錘子公司被申請破產:與債權方達成和解,流程已撤回
醜數
題目
給你一個整數 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 包含其他質因數,不是醜數。
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 個醜數。
使用最小堆,會預先儲存較多的醜數,導致空間複雜度較高,維護最小堆的過程也導致時間複雜度較高。
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];
}
}
超級醜數
超級醜數 是一個正整數,並滿足其所有質因數都出現在質數陣列 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一致,兩種方法都行。