เราต้องสร้างฟังก์ชันขึ้นมาหนึ่งฟังก์ชันเพื่อค้นหาจำนวนที่น่าเกลียดสุดอันดับที่ 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