Super Ugly Numbers คือจำนวนเต็มบวกที่ตัวประกอบเฉพาะ (prime factors) ทั้งหมดอยู่ในรายการเฉพาะ primes ที่กำหนด ต้องหา Super Ugly Number ตัวที่ n
ตัวอย่าง: n = 12, primes = [2, 7, 13, 19] ผลลัพธ์: 32
ลำดับ 12 ตัวแรก: [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32]
ขั้นตอนการแก้ปัญหา (Min Heap + Multiple Pointers)
- โครงสร้าง
Dataเก็บnum, prime, idx - ถ้า
n == 1คืน 1 - อาร์เรย์
vขนาดn+1เติม 1 - Min Heap
pqใส่Data(primes[i], primes[i], 2)สำหรับทุกprime - วน
iจาก 2 ถึงn:- ดึง
currจากpqval := curr.num v[i] := val- อัปเดต
curr.num := curr.prime * v[curr.idx],curr.idx++ใส่กลับpq while val == pq.top().num(กันซ้ำ):- ดึง
currอัปเดตเหมือนกัน ใส่กลับ
- ดึง
- ดึง
- คืน
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));
}
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];
}
};
int main() {
Solution ob;
vector<int> v = {2,7,13,19};
cout << (ob.nthSuperUglyNumber(12, v));
}
อินพุต
12 [2,7,13,19]
เอาต์พุต
32