เราต้องสร้างฟังก์ชันขึ้นมาหนึ่งฟังก์ชันเพื่อค้นหาจำนวนที่น่าเกลียดสุดอันดับที่ n ตัวเลขที่น่าเกลียดอย่างยิ่งเป็นจำนวนบวกที่มีตัวประกอบเฉพาะทั้งหมดอยู่ในจำนวนเฉพาะรายการเฉพาะของขนาด k ดังนั้นหาก n คือ 12 และจำนวนเฉพาะคือ [2, 7, 13, 19] แล้วผลลัพธ์จะเป็น 32 นั่นเป็นเพราะ [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] เป็นลำดับของตัวเลขที่น่าเกลียดมาก 12 ตัว
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
สร้างโครงสร้างข้อมูล triplet ด้วย num, prime และ idx
-
ถ้า n เป็น 1 ให้คืนค่า 1 สร้างอาร์เรย์ขนาด n + 1 แล้วเติมด้วย 1
-
กำหนดลำดับความสำคัญของคิว pq
-
สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของจำนวนเฉพาะ−
-
สร้างแฝดสาม t(primes[i], primes[i], 2)
-
-
สำหรับฉันอยู่ในช่วง 2 ถึง n
-
curr :=องค์ประกอบด้านบนของ pq จากนั้นลบออกจาก pq
-
val :=จำนวนสกุลเงิน
-
v[i] :=วาล
-
num ของ curr :=ไพรม์ของ curr * v[index of curr]
-
เพิ่มดัชนีของสกุลเงินโดย 1
-
ใส่เคอร์เนลลงใน pq
-
ในขณะที่ val =num ของ pq ด้านบน
-
curr :=ด้านบนของ pq และลบออกจาก pq
-
num ของ curr :=ไพรม์ของ curr * v[index of curr]
-
เพิ่มดัชนีของสกุลเงินโดย 1
-
ใส่เคอร์เนลลงใน pq
-
-
-
กลับ v[n]
ตัวอย่าง (C++)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
#include <bits/stdc++.h>
using namespace std;
struct Data{
int num, prime, idx;
Data(int a, int b, int c){
num = a;
prime = b;
idx = c;
}
};
struct Comparator{
bool operator()(Data a, Data b){
return !(a.num < b.num);
}
};
class Solution {
public:
int nthSuperUglyNumber(int n, vector<int>& primes) {
if(n == 1)return 1;
vector <int> v(n + 1, 1);
priority_queue < Data, vector < Data >, Comparator > pq;
for(int i = 0; i < primes.size(); i++){
pq.push(Data(primes[i], primes[i], 2));
}
int x;
for(int i = 2; i <= n; i++){
Data curr = pq.top();
pq.pop();
int val = curr.num;
v[i] = val;
curr.num = curr.prime * v[curr.idx];
curr.idx++;
pq.push(curr);
while(val == pq.top().num){
curr = pq.top();
pq.pop();
curr.num = curr.prime * v[curr.idx];
curr.idx++;
pq.push(curr);
}
}
return v[n];
}
};
main(){
Solution ob;
vector<int> v = {2,7,13,19};
cout << (ob.nthSuperUglyNumber(12, v));
} อินพุต
12 [2,7,13,19]
ผลลัพธ์
32