สมมติว่าเรามีตัวเลข n; เราต้องหาเลขน่าเกลียดตัวที่ n อย่างที่เราทราบกันดีว่าตัวเลขขี้เหร่คือตัวเลขเหล่านั้น ซึ่งมีตัวประกอบเฉพาะคือ 2, 3 และ 5 ดังนั้นถ้าเราต้องการหา 10 th จำนวนน่าเกลียด ผลลัพธ์จะเป็น 12 เนื่องจากตัวเลขที่น่าเกลียดสองสามตัวแรกคือ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 เป็นต้น
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:
- กำหนดอาร์เรย์ v ขนาด (n + 1)
- ถ้า n เหมือนกับ 1 แล้ว:
- คืน 1
- สอง :=2, สาม :=3, ห้า :=5
- twoIdx :=2, threeIdx :=2, fiveIdx :=2
- สำหรับการเริ่มต้น i :=2 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ:
- curr :=ขั้นต่ำสอง สาม และห้า
- v[i] :=curr
- ถ้า curr เหมือนกับสอง ดังนั้น:
- สอง :=v[twoIdx] * 2;
- (เพิ่ม twoIdx โดย 1)
- ถ้าสกุลเงินเท่ากับสาม ดังนั้น:
- สาม :=v[threeIdx] * 3
- (เพิ่ม 3Idx โดย 1)
- ถ้าสกุลเงินเท่ากับห้า ดังนั้น:
- ห้า :=v[fiveIdx] * 5
- (เพิ่ม fiveIdx ขึ้น 1)
- ส่งคืน v[n]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:
ตัวอย่าง
#include using namespace std; class Solution { public: int nthUglyNumber(int n) { vector v(n + 1); if(n == 1){ return 1; } int two = 2, three = 3, five = 5; int twoIdx = 2; int threeIdx = 2; int fiveIdx = 2; for(int i = 2; i <= n; i++){ int curr = min({two, three, five}); v[i] = curr; if(curr == two){ two = v[twoIdx] * 2;; twoIdx++; } if(curr == three){ three = v[threeIdx] * 3; threeIdx++; } if(curr == five){ five = v[fiveIdx] * 5; fiveIdx++; } } return v[n]; } }; main(){ Solution ob; cout << (ob.nthUglyNumber(15)); }
อินพุต
15
ผลลัพธ์
24